第一次攻防世界逆向小記錄(純re小白)

insanity

拖進IDA
直接F5查看見源代碼
shift+F12查看main函數的字符串得到flag


python-trade

一道python逆向題
我們下載附件得到pyc文件
(pyc文件就是 py程序編譯後得到的字節碼文件)

安裝uncompyle6
uncompyle6 test.pyc > test.py得到py文件
一個簡答的加密函數,編寫解密函數即可得到flag~

open-source

F5查看源代碼
由於大一學的c語言,很久沒用了,忘得差不多了,這兒記錄一下函數的意義
strcpy就是複製字符串的意思
memset(str,’$’,7);將str的前7個字符變爲’$’
put就是打印的意思
scanf讀取輸入
strcmp比較字符串
strcat截取字符串

就是和一個16進制的字符串對比
在這裏插入圖片描述即輸入CrackMeJustForFun,則success,所以flag就是爲CrackMeJustForFun

open-source

拿到一段c語言的源代碼

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc != 4) {
    	printf("what?\n");
    	exit(1);
    }

    unsigned int first = atoi(argv[1]);
    if (first != 0xcafe) {
    	printf("you are wrong, sorry.\n");
    	exit(2);
    }

    unsigned int second = atoi(argv[2]);
    if (second % 5 == 3 || second % 17 != 8) {
    	printf("ha, you won't get it!\n");
    	exit(3);
    }

    if (strcmp("h4cky0u", argv[3])) {
    	printf("so close, dude!\n");
    	exit(4);
    }

    printf("Brr wrrr grr\n");

    unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;

    printf("Get your key: ");
    printf("%x\n", hash);
    return 0;
}

成語編譯的時候會出錯,記得加上#include <cstdlib>就可以了

然後編譯成exe文件g++ 8b6405c25fe447fa804c6833a0d72808.c -o cc.exe

按着順序輸入就可以了
在這裏插入圖片描述

simple-unpack

查看文件信息
在這裏插入圖片描述
64位文件,upx加殼

解法一

直接拖進IDA,以二進制的方式打開然後SHIFT+F12,就能看見flag

解法二

直接upx脫殼
在這裏插入圖片描述然後再用IDA打開同樣能看見flag
在這裏插入圖片描述

logmein

1.查殼
在這裏插入圖片描述2.拖入IDA
找到main函數,F5反編譯
在這裏插入圖片描述

void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
  size_t v3; // rsi
  int i; // [rsp+3Ch] [rbp-54h]
  char s[36]; // [rsp+40h] [rbp-50h]
  int v6; // [rsp+64h] [rbp-2Ch]
  __int64 v7; // [rsp+68h] [rbp-28h]
  char v8[8]; // [rsp+70h] [rbp-20h]
  int v9; // [rsp+8Ch] [rbp-4h]

  v9 = 0;
  strcpy(v8, ":\"AL_RT^L*.?+6/46");
  v7 = 28537194573619560LL;
  v6 = 7;
  printf("Welcome to the RC3 secure password guesser.\n", a2, a3);
  printf("To continue, you must enter the correct password.\n");
  printf("Enter your guess: ");
  __isoc99_scanf("%32s", s);
  v3 = strlen(s);
  if ( v3 < strlen(v8) )
    sub_4007C0(v8);
  for ( i = 0; i < strlen(s); ++i )
  {
    if ( i >= strlen(v8) )
      ((void (*)(void))sub_4007C0)();
    if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
      ((void (*)(void))sub_4007C0)();
  }
  sub_4007F0();
}
需要注意的是,x86系列的CPU都是以小端序儲存數據的,即低位字節存入低地址,高位字節存入高地址,所以正確的字符串應該反過來,即

腳本


v7 = 'harambe'
v8 = ':\"AL_RT^L*.?+6/46'
flag = ''
for i in range(len(v8)):
    c = ord(v7[i % 7]) ^ ord(v8[i])
    flag += chr(c)
   
print(flag)

game

在main函數中,我們可以看見,當滿足一定條件是
在這裏插入圖片描述我們跟進這個函數
在這裏插入圖片描述很明顯這是我們想要的flag了~~
編寫exp

a= [18,64,98,5,2,4,6,3,6,48,49,65,32,12,48,65,31,78,62,32,49,32,1,57,96,3,21,9,4,62,3,5,4,1,2,3,44,65,78,32,16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16,0]
b=[123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0]
flag = ''
for i in range(56):
    a[i] = a[i]^b[i]
    a[i] = a[i]^19
    flag+=chr(a[i])
print(flag)

這兒會自動轉換位ascii碼來進行異或運算~~

getit

在這裏插入圖片描述雙擊s就可以看見字符串
在這裏插入圖片描述然後編寫exp

a = 'c61b68366edeb7bdce3c6820314b7498'
flag = ''
for i in range(len(a)):
    if i&1:
        x=1
    else:
        x=-1
    flag+=chr(ord(a[i])+x)
print(flag)

re1

這道題目我們用IDA打開,查看僞代碼
在這裏插入圖片描述我們知道當我們輸入正確的值時,就會輸出flag,這個值肯定就會存在某個常量中(因爲這道題目不設到算法),但是我們SHIFT+F12確沒看見,但是我們將這個exe文件放到記事本中是可以看見flag的,這是因爲IDA將數據當作代碼處理了
畢竟IDA僞代碼不是很準確~~
在這裏插入圖片描述

no-strings-attached

這個是ELF文件,我們先放進IDA中
F5查看僞代碼
在這裏插入圖片描述我們跟進authenticate()函數
在這裏插入圖片描述這個應該就是關鍵函數了
在這裏插入圖片描述我們可以看見這個函數的地址爲08048720,所以我們下斷點就可以下在08048725

然後用gdb動態調試
在這裏插入圖片描述最後顯示的就是flag的ascii嘛

gdb的命令順序爲

  • b *0x08048725(下斷點)
  • r(運行程序)
  • x/100uw $eax(查看寄存器的內容)

IDA遠程調試ELF

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