문제를 다운로드 해서 풀어보면 

 

 

입력 받았던 값을 그대로 출력해준다.

그래서 조금더 확인해보고자 IDA를 사용해서 확인해보았다.

 

 

음 여기서는 볼만한게 없는것 같다.

그래서 여기서 나오는 vlun 함수를 보기위해서 한번 들어가 보았다.

 

 

1. char s 는 2056 byte를 할당 받았다 

2. char format은 1032 byte를 할당 받았다. (format과 s는 1024byte 차이)

3. fgets 함수는 s를 1024byte 까지 받는다. 

4. sprintf 함수는 format을 1024만큼 받는다. 

-> 그러면 여기서 우리가 이전에 했었던 오버플로우 기법은 힘들어 보인다. 

    (메모리의 크기가 1024차이가 나는데 1024만큼 받기 때문)

 

그런데 여기서 주의해야 할 점은 바로 이부분이다.

 

 

분명히 배열의 형태로 받고는 있지만 서식문자열이 없다. 

char format이라고 선언을 했으니 문자열의 가능성이 높아보이는데 그러면 %s가 있어야 한다.

또 함수들을 찾아보다가 flag라는 이름의 함수를 확인 할 수 있었다.

 

 

Shell을 이용하는 함수였다. 

그러면 우리가 아까 보았던 format을 이용해서 flag를 실행하도록 하면 되지 않을까

 

아까 snprintf함수는 서식 문자열이 없는 상태였다. 

그래서 서식문자열을 한번 입력해보았더니 

 

 

입력했던 aaaa 문자열이 들어가고 그다음 0이 나오고 그다음 서식문자열의 결과 값이 나온다.

두번째 서식문자열에서 처음 입력한 4byte를 포인팅하고 있다.

aaaa의 문자열을 0x61616161이 포인팅을 하고 있다는 이야기가 된다.

 

아까 코드를 확인했을때 printf(format)이라고 되어있었으니까 이 printf 함수의 주소에 

flag함수의 주소로 바꿔주거나 아니면 덮어쓴다면? -> flag를 얻을지도 모른다.

 

flag의 주소를 확인해보자 

flag의 주소  = 080485B4

 

printf 함수의 주소를 확인해보자 

printf plt = 080483D0

 

 

printf got = 804A00C

printf 를 알기위해서는 plt와 got를 알아야 한다. 

해당 정보는 아래에서 확인하기 바란다.

https://bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/

 

앞에서 말한것 처럼 

아까 코드를 확인했을때 printf(format)이라고 되어있었으니까 이 printf 함수의 주소에

flag함수의 주소로 바꿔주거나 아니면 덮어쓴다면?

-> flag를 얻을지도 모른다. 

-> 그래서 아래의 코드로 payload를 작성했다.

 

from pwn import*                                                                                                                                     
p = remote("ctf.j0n9hyun.xyz",3002)                                                                                                                   

p.recvuntil("input : ")                                                    
printf_got = 0x804a00c                                                     
payload =p32(printf_got)+"%134514096x%n"  #flag addr - 4byte                                                                        

p.sendline(payload)                                                        
p.interactive()

 

"AAAA"가 들어갈 자리에 printf_got를 적어주면,

0x61616161이라고 나왔던 것이 printf_got 주소로 바뀔 것이다.

또한, printf_got를 flag 함수의 주소인 0x80485b4=134514100으로 바꿔주었다.

 

그러면 printf(flag())? 라는 느낌이 드는데...(예시니까 흘려도 되용)

 

flag함수를 실행을 하게 되는데 134514100이 아닌 134514096으로 payload를 작성했다.

이유는 우리가 아까 서식문자열을 입력했을 때, 두번째 부터 입력값을 포인팅하고 있었기 때문에 

첫번째 4byte는 빼줘야 한다. 그래서 134514100 - 4 = 134514096이 된다. 

 

 

flag를 확인하였다. 

FSB를 이용한 문제였는데 조금더 공부를 해야할것 같다.

 

'CTF' 카테고리의 다른 글

Hack CTF x64 Buffer Overflow  (0) 2021.09.25
Hack CTF - 내 버퍼가 흘러넘친다  (0) 2021.09.25
Pwnable.kr 1 - fd  (0) 2021.09.24
Hack CTF basic Bof #2  (0) 2021.09.22
Hack CTF basic bof#1  (0) 2021.09.22

+ Recent posts