介绍身份证号码核对婚姻信息软件(一键身份证号码查询婚姻信息)
这一系列文章是可以出版的.krToddlr’在sBottle所有问题的答案中,有三个相对比较难或者比较经典的问题,分别写出来,其他问题的问题一起发布。
0x02fd
Ssh连接
看一下目录
我们需要执行标志或检查标志的内容
看标题的提示,就知道标题和文件描述符有关
看看源码
在代码中,我们可以看到我们必须通过strcmp(比较后会输出
查看strcmp的用法
可知,strcmp(,如果参数s1和s2的字符串相同,则返回0,如果s1大于s2,则返回大于0的值,如果s1小于s2,则返回小于0的值。
如果希望在代码中执行catflag,If语句应该满足strcmp返回0的要求,即buf的内容应该是LETMEWIN
那么buf的值哪来的呢
manread可知
缓冲区的值由read控制,计数字节从fd读取
代码中fd的值是atoi(argv[1]0x1234
atoi(用于把字符串转换为整数
根据linux下的文件描述符(源码在/usr/include/unistd.h)
也就是说,文件描述符0代表标准输入,这是我们可以从命令行控制的。
我们可以控制Atoi接收的参数,只要argv[1]为0x1234(argv[为程序名称,argv[1]为输入参数),0x1234小数为4660,运算后赋给fd的最后一个值为0,然后传入read(,因为fd为0,所以我们在命令行中输入的内容就是我们在缓冲区中写入的内容,只需输入LETMEWIN即可
分析完了,我们来测试一下
通过关闭ssh连接,注销
0x 02碰撞
看,标题描述应该和哈希冲突有关
看看源代码
在main(中看到传入的argv[1]需要满足条件:
长度为20字节,通过检查_密码后的返回值是硬编码的0x21dd09ec
那我们需要看一下支票_password的逻辑
可以看出,该参数是一个char指针,在逻辑中被强制键入一个int指针
从大小来看,也就是1个字节转换成4个字节,总共20个字节,20/4=5,这正好对应于for循环中的5次for循环是一个累积操作,即累积和等于0x21DD09EC
Emmm简单理解,就是输入20个字节,每4个字节为一组,一共5组,这5组加起来等于0x21dd09ec。
这就很简单了
我把16个字节设为0x1,那么剩下的4个字节应该就是相差的0x 1d 905 e 8,而且因为小端序,你写的时候可以反写,如下图所示
0x03bof
根据标题描述,这是一个缓冲区溢出的问题
下载bof及其代码
看看源码
请注意,func是在main中调用的,参数是0xdeadbeef
而func(如中所示,获取shell需要参数0xcafebabe
我们注意到我们可以通过gets in函数控制输入像本主题这样的get用法非常危险,很容易造成缓冲区溢出攻击这一次,我们将来到pwn放下它
我们尝试输入写字符看看
基本思想是找到确定的失调,然后用0xcafebabe覆盖0xdeadbeef。
偏移是多少呢
配合gdb来看看
在main下断点
输入r启动
在断点处停下了
让我们反汇编func,看看比较键和0xcafebabe指令在哪里
参见上面红色方框中的cmp说明,这是关键
您可以看到地址是0x56555654
在这里下个断点
按c继续执行
到达第二个断点后,让我们看看堆栈的布局
我们可以看到0xdeadbeef在0xffffd330,我们输入的A从0xffffd2fc开始
嗯,数数从开始的0x41到0xdeadbeef,我勾选了13*4=52个字节,在53-在56处写入0xcafebabe以覆盖原始0xdeadbeef
编写pwntools脚本
如图所示,一枚炮弹被打了回来
本文由(发表,不代表立场,转载,联系作者并注明出处: