好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 faqiadegege 于 2025-8-12 16:35 编辑
该用例包含flag.txt,依旧还是想办法利用溢出读取flag.txt文件内容尝试运行,确定溢出长度
确定函数列表
看来还是和之前一样,溢出后利用print_file基本payload格式
寻找gadget源程序中,作者给了如下汇编,看来是可以用起来的
pext指令: pext dest, src,mask
dest:目标寄存器,将存储提取后的位
src:源寄存器,提供要提取位的数据
mask:掩码寄存器,指示要从 src 中提取哪些位mask 中的每一位决定了是否从 src 中提取对应的位。如果掩码中的某一位是 1,那么对应的位会被提取到目标寄存器 dest 中,提取的位会按从低位到高位的顺序排列
xchg指令
xchg destination, source
destination:目标操作数,交换后的结果会存储在这个位置
source:源操作数,交换前的值会存储在这个位置。
交换两个操作数的值,并且不需要额外的中间寄存器
bswap指令
bswap reg32
将寄存器中的字节按照从低字节到高字节的顺序进行反转。
例如,字节顺序为 AB CD EF 01 的 32 位数据会被转换为 01 EF CD AB
使用 xchg dl, [ecx] ,
使用edx存字符串,
然后存储到内存ecx处使用
pop ecx; bswap ecx; ret
这里ecx保存.bss段地址
存字符串使用 pext 指令
mov eax,ebp
mov ebx,0xb0bababa
pext edx,ebx,eax
mov eax,0xdeadbeef
ret
上面已知,ebx,需要计算出的edx是最终的falg.txt中的每一个字符,则需要想办法逆运算处eax,即掩码的值
完成这个过程就可以将字符一个个存到 .bss 段中 | address0 | pip ebp
ret | | address1 | mov eax,ebp
mov ebx,0xb0bababa
pext edx,ebx,eax
mov eax,0xdeadbeef
ret | | address2 | pop ecx
bswap ecx
ret | | address3 | xchg BYTE PTR [ecx],dl
ret | ebx,即源操作数,值为0xb0bababa
ebx
0xb0bababa
0b10110000 1011 1010 1011 1010 1011 1010
f
0x66
0b0110 0110
可能的mask:
{
取源操作数的:14 11 9 8 6 3 1 0
-> 0 1 1 0 0 1 1 0
}
01001011 0100 1011
->
4b4b
最左侧14位是0,不做处理,则最终的mask为:
10110100 1011
->
b4b
同样的使用该原理,可以得到其他7个字符的mask值,最终所有的mask为:
f -> 0b101101001011 -> 0xb4b
l -> 0b1011011101 -> 0x2dd
a -> 0b1110101000110 -> 0x1d46
g -> 0b101101011010 -> 0xb5a
. -> 0b11011011 -> 0xdb
t -> 0b101011001101 -> 0xacd
x -> 0b1101011000101 -> 0x1ac5
t -> 0b101011001101 -> 0xacd
至此,利用链可以构造标识:
| pop_ebp_address | pop ebp
ret | pext_address | mov eax,ebp
mov ebx,0xb0bababa
pext edx,ebx,eax
mov eax,0xdeadbeef
ret | pop_ecx_address | pop ecx
bswap ecx
ret | xchg_address | xchg dl, [ecx]
ret | bss_address | .bss 段地址 |
构造之后再使用,
即可完成利用利用脚本
利用结果
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|
|