首页
社区
课程
招聘
[求助]在利用sprintf进行rop时发现,只能跳一次,发送的payload加长之后就跳不了了,请问这是为什么
发表于: 2023-4-17 11:04 10737

[求助]在利用sprintf进行rop时发现,只能跳一次,发送的payload加长之后就跳不了了,请问这是为什么

2023-4-17 11:04
10737

反编译代码

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"*(0x92-len(exp)) +b'f'+ gadget + b'a'*0x1C + b'a'*4 + bin_sh_addr + gadget + b'a'*0x1C + b'a'*8 + system_addr
exp += b"b"*(0x93-len(exp)) + b'\x40\x01\x41'
···

用不注释的exp能跳转到system,但后面再加东西就跳不到system了,我也就没办法给system传参,这是为什么?
另外,实际实现rop的偏移跟我一开始计算的偏移不一样,我是用-(0x128-0x24+4)计算得到的v6到ra偏移,但这个没法用,后来用二分法试才试出现在的偏移,这是算错了吗?
请指教!


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2023-4-17 13:51 被话梅可乐编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 7833
活跃值: (1566)
能力值: ( LV12,RANK:256 )
在线值:
发帖
回帖
粉丝
2
%0截断
2023-5-10 14:36
0
游客
登录 | 注册 方可回帖
返回
//