攻防世界新手区刷题日记

get_shell

打开题目,发现有一个题目场景,然后看题目描述说运行就能拿到shell,所以先运行一下,看看会发生什么,在虚拟机终端上输入nc+ip地址+ip端口(连接该网址),然后输入cat flag

在这里插入图片描述
发现运行一下flag就真的出来了。

CDfsb

这道题也给了一个题目场景,先尝试上面的方法将其运行一下,看看会发生什么
在这里插入图片描述
结果并不像上题这么直接,该题还给了一个附件,将其下载下来,先用checksec分析一下文件
在这里插入图片描述
发现该文件是有Canary保护和NX保护然后是32位的,再放入32位ida中反编译看看
在这里插入图片描述
发现当pwnme的值等于8时,才会输出flag,所以查找pwnme所在的位置在bss段(tips:bss段为未初始化的数据的全局变量),题目描述中也提到printf,这提示我们可以从这下手,将pwnme的值改成8,在ida中查看第二个printf的地址使用gdb在第二个printf的地址上下一个断点)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
知道了偏移量是10,接着打payload(这里参考了wp里的代码):
在这里插入图片描述
运行一下即可得到flag;

在这里插入图片描述

hello_pwn

拿到文件checksec一下
在这里插入图片描述
是64位文件,就丢到64位ida中看一下源码
在这里插入图片描述
点开sub_400686函数
在这里插入图片描述
发现只要满足if条件就会调用sub_400686函数然后就直接跳到system函数得到flag,因为read函数是读到unk_601068地址下的,所以点开看看和dword_60106C的位置差多少就可以知道偏移量
在这里插入图片描述
得到偏移量为4,可以开始写payload了
在这里插入图片描述
在这里插入图片描述

cgpwn2

拿到文件checksec一下(因为是新版的checksec,没有显示文件的信息,那就32位ida和64位ida都扔进去看看)
在这里插入图片描述
发现里面只有hello函数比较可以能存在溢出点进去看看
在这里插入图片描述
发现这里有两个读取函数,其中把鼠标移到name那里可以看到name是一个可以接受52个字符的数组,而这里限定了输入50个字符所以不存在溢出,但是第二个gets函数并没有限制输入,所以可以利用这里进行栈溢出在这里插入图片描述这个函数是有system的但是没有/bin/sh,而是有个“echo hehehe”这个字符,先打个payload试试看这个会显示什么(疑问:这个可以调用到system吗?)
在这里插入图片描述
然后结果是好像并没有什么用在这里插入图片描述
在这里插入图片描述
所以我们还是得给这个程序加上/bin/sh的字符,在哪加呢?这时候就可以利用前面输入name的这个数组空间了,那么写一下payload2.0(鉴于是32位程序是利用栈来传参,所以这里的payload的压栈顺序应该是先压system的地址然后再压/bin/sh的)
在这里插入图片描述
在这里插入图片描述

when_did_you_born

放到64位ida中查看反编译代码
在这里插入图片描述
逻辑还是很清晰的,第一个输入时只要输1926则程序结束,所以只要输其他的就可以进入else中。可以看到else中有“system(cat flag)”,只要让程序跑到这一步就可以得到flag了,但是要执行这一步v5就得赋值为1926,而前面我们给v5已经赋值过了一个不是1926的值。这时可以看到第二个输入函数gets(&v4)是不检查输入长度的可以实现栈溢出,利用这一点只要把v5的值改为1926就可以
在这里插入图片描述
可以看到v4和v5的距离差8,现在可以开始写wp了
在这里插入图片描述
在这里插入图片描述

level0

放入64位ida中查看
在这里插入图片描述
题目有提示说是溢出,所以应该是在vulnerable_function()这个函数中,点开看看这个函数的内容
在这里插入图片描述
发现read函数存在可溢出的地方,字符列表中可以看到这个题目是有system和/bin/sh的
在这里插入图片描述

看函数列表有个叫callsystem的函数,点开看看
在这里插入图片描述
wp
在这里插入图片描述
在这里插入图片描述

level2

放到32位ida中查看
在这里插入图片描述
点开vulnerable_function()查看函数内容
在这里插入图片描述发现read函数除存在溢出点,查看一下字符列表,发现这题也是有system和/bin/sh
在这里插入图片描述
这里就知道了/bin/sh的地址(这里看到的并不是system真正的地址),所以这时看到函数列表中有_system函数,点开查看它的地址
在这里插入图片描述
点开看到system的参数栈要求4,所以在写wp的时候在传/bin/sh的地址前,要先传4个字符
在这里插入图片描述

wp
在这里插入图片描述
在这里插入图片描述

guess_num

方法一

做这道题,首先需要了解一下c语言的rand和srand随机函数(http://c.biancheng.net/view/2043.html),然后来看一下代码逻辑
在这里插入图片描述
sub_C3E函数:
在这里插入图片描述
可以知道要连续答对10次伪随机数的值就调用到sub_C3E函数得到flag,main函数中存在的溢出点是在gets函数这里。前面已经了解过rand和srand的机制了,所以只要我们能控制种子,就可以得到这十个数的确切值是多少。开始我是用Windows系统下写了这个随机数生成的程序发现和在ubuntu上写得到的数据是不一样的
windows:
在这里插入图片描述
ubuntu:
在这里插入图片描述
还是以ubuntu上的为准,要先输入32个字符使得溢出到seed的位置,因为长度是8,只有全部填充才可以控制种子的值,要不后面的数还是不确定的,接着按顺序输入刚刚得到的十个数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法二

先用ldd来查询一下所用的libc库
在这里插入图片描述
也可以在脚本中利用elf文件来查找
在这里插入图片描述

然后再利用python库中自带的ctypes模块来进行python和c混合编程,得到wp
在这里插入图片描述
在这里插入图片描述

int_overflow

放入ida中
在这里插入图片描述
发现,这里只能输入1,让v4等于1才可以进行到下一步,点开login()函数查看一下
在这里插入图片描述
这里的函数好像也没有栈溢出的地方,在继续往下看check_passwd()函数
在这里插入图片描述
这里发现了可疑函数strcpy,若能覆盖掉dest的返回地址,然后就可以执行我想要的地址下的内容,在字符串列表中明显可以看到该题是有system和cat flag的字符的
在这里插入图片描述再找一下函数列表可以发现我们想要执行的目标函数what_is_this
在这里插入图片描述
但是要执行到strcpy函数就得让v3的值在(3,8]之间,但是如果v3在这个范围内而覆盖到dest需要0x14的大小,v3就不可能可以覆盖到,这时就需要利用另一个漏洞即题目所说,整数溢出
PS:
在这里插入图片描述
这里的v3是无符号整型,所以范围是21,而s的值却可以输入长度为0x199(十进制409)的数,所以v3的值的范围也可以在(259,264]之间。关于溢出这里做一个小小的测试来更好的说明一下:
在这里插入图片描述
这里可以说明上面的方法是可行的
wp:
在这里插入图片描述
在这里插入图片描述

PS:除了0x14还要加4的原因是因为在ida中查看dest离它的返回地址的距离其实是还有0x4的距离
在这里插入图片描述
或者看汇编的内容来判断(这里的判断方法借鉴一下攻防世界里的wp)

在这里插入图片描述
“在字符串拷贝之前,先把拷贝的源地址和目的地址压入堆栈,这里似乎没有任何问题,查看整个函数的汇编代码,就会发现,在函数最开始,压入ebp变量,在函数结尾,存在一条leave指令,而在32位程序中,leave指令等于mov esp,ebp和pop ebp两条指令的组合,也就是说在覆盖函数返回地址之前,还有一次出栈操作,出栈数据大小为4字节,即覆盖之前还需将这4字节覆盖了,才能实现跳转指向what_is_this函数”


  1. 0,255 ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值