B0::CTF小白热身赛round1 pwn writeup

writeup仅代表个人理解,面向0基础小白,如有疏漏,敬请指正

PWN

Linux系统输入nc就能连接了(🍼)

经典签到题,百度下nc的意思。打开题目环境实例,在自己的linux虚拟机里用nc连接给定的ip:port即可
image

打开linux终端,输入 nc 123.249.89.45 49365 会返回你靶机的shell
ls 发现目录下有flag
cat /flag 即可得到flag

image

你是哪个省的(🍼)

拿到题目附件先用checksec查查开启了什么保护

image

仅开启了NX(堆栈不可执行)保护
再使用IDA反编译文件源码

image

这题附件给的有点问题 字符串“Ding Zhen"中间的空格应该去掉,scanf读不进空格。直接输入"DingZhen"即可。考点是下面的溢出。这里read函数明显存在溢出点,溢出修改栈上变量即可。

image

|rsp|...|rbp|ret| -> |rsp|...|xxx|hack|(🍼)

经典入门题,ret2text板子题,资料可参阅CTF.wiki等网站

温馨提示,题目附件更换过,一开始没做出来的别灰心再试试。

image

发现是64位程序,NX保护开启。

用IDA打开找到main函数

image

发现read读取了0x40的数据,而s仅有32,明显存在溢出。再shift+F12查找字符串

image

发现/bin/sh system

image
image

顺藤摸瓜,找到出题人留的危险函数system("/bin/sh")。只要设法使其执行,即可得到shell。
这里可以看到其地址为0x4006E6

我们再双击s,在IDA内看看s的栈结构

image

发现变量到返回地址的距离为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,大家有兴趣可以自行学习。

posted on 2022-11-14 13:05  APPPQRS  阅读(112)  评论(0编辑  收藏  举报