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)看一下:

找到了溢出點: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章