B0::CTF小白热身赛round1 pwn writeup
writeup仅代表个人理解,面向0基础小白,如有疏漏,敬请指正
PWN
Linux系统输入nc就能连接了(🍼)
经典签到题,百度下nc的意思。打开题目环境实例,在自己的linux虚拟机里用nc连接给定的ip:port即可
打开linux终端,输入 nc 123.249.89.45 49365
会返回你靶机的shell
ls
发现目录下有flag
cat /flag
即可得到flag
你是哪个省的(🍼)
拿到题目附件先用checksec查查开启了什么保护
仅开启了NX(堆栈不可执行)保护
再使用IDA反编译文件源码
这题附件给的有点问题 字符串“Ding Zhen"中间的空格应该去掉,scanf读不进空格。直接输入"DingZhen"即可。考点是下面的溢出。这里read函数明显存在溢出点,溢出修改栈上变量即可。
|rsp|...|rbp|ret| -> |rsp|...|xxx|hack|(🍼)
经典入门题,ret2text板子题,资料可参阅CTF.wiki等网站
温馨提示,题目附件更换过,一开始没做出来的别灰心再试试。
发现是64位程序,NX保护开启。
用IDA打开找到main函数
发现read读取了0x40的数据,而s仅有32,明显存在溢出。再shift+F12查找字符串
发现/bin/sh system
顺藤摸瓜,找到出题人留的危险函数system("/bin/sh")。只要设法使其执行,即可得到shell。
这里可以看到其地址为0x4006E6
我们再双击s,在IDA内看看s的栈结构
发现变量到返回地址的距离为0x20+0x8 那么我们只需要填充0x28的垃圾数据,再把危险函数的地址填充到本来的返回地址上,即可得到shell。
为此我们编写py脚本如下:
点击查看代码
##!/usr/bin/env python
from pwn import *
sh = remote('123.249.89.45',49369)
#sh = process('/home/giantbranch/temp/pwn')
target = 0x4006E6
sh.sendline('A' * (0x20+8) + p64(target))
sh.interactive()
需要补充说明的是,在IDA直接观察得到的偏移量0x28不一定准确。另一种较为准确的方法是采取ctf.wiki中动态调试的方式。而笔者经常使用的方式是利用cyclic,大家有兴趣可以自行学习。