日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

攻防世界re(新1手区)1-12题

發布時間:2024/3/24 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 攻防世界re(新1手区)1-12题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

Hello, CTF

Insanity

python-trade

re1

game

open-source

simple-unpack

logmein

no-strings-attached

getit

csaw2013reversing2

maze


Hello, CTF

直接運行是個驗證字符串是否為flag的程序

File 命令查看 顯示為32位程序

ida打開 Shift+F12 查看字符串變量列表 可以看到一串字符串 猜測為加密后的flag

在左邊的函數列表找到main 函數,雙擊進入并按F5 反編譯,查看偽代碼

C 庫函數 int sprintf(char *str, const char *format, ...) 發送格式化輸出到 str 所指向的字符串。

C 庫函數 char *strcat(char *dest, const char *src)src 所指向的字符串追加到 dest 所指向的字符串的結尾。

直接16進制轉string就行

Insanity

32位的程序但不是PE文件,是ELF文件,將程序在Linux環境下運行

查看字符串列表即可

python-trade

python反編譯 - 在線工具 反編譯pyc文件

寫個逆向解碼函數輸出即可

#!/usr/bin/env python

# visit https://tool.lu/pyc/ for more information

import base64

def encode(message):

??? s = ''

??? for i in message:

??????? x = ord(i) ^ 32

??????? x = x + 16

??????? s += chr(x)

???

??? return base64.b64encode(s)

def decode(message):

?????? messages =? base64.b64decode(message)

?????? s = ''

?????? for i in messages:

????????????? x = ord(i) - 16

????????????? x = x ^ 32

????????????? s += chr(x)

?????? return s

correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'

print(decode(correct))

re1

查看偽代碼發現判斷flag的邏輯為輸入的值與v5變量值比較,v5的值又來自_mm_loadu_si128函數對xmmword_413E34變量的處理 類似于memset(),將xmmword_413E34的值賦值給v5

雙擊xmmword_413E34跟進,可以看到dutctf的字樣 還有一段16進制字符串

使用R鍵功能,能夠將十進制的數轉換為字符串。這里為小端序排列 需要逆序

game

玩游戲 輸入正確的順序讓圖標都點亮就行

Ida分析直接看main函數 最后通過判斷之后調用的函數

雙擊跟進sub_457AB4()函數

再跟進sub_45E940(),通過循環,將a和b數組的值進行xor運算,然后再將數組a的值與0x13 xor運算

寫腳本

v6 = [0]*56

v3 = [0]*54

v4 = [0]*33

v6[0] = 18

v6[1] = 64

v6[2] = 98

v6[3] = 5

v6[4] = 2

v6[5] = 4

v6[6] = 6

v6[7] = 3

v6[8] = 6

v6[9] = 48

v6[10] = 49

v6[11] = 65

v6[12] = 32

v6[13] = 12

v6[14] = 48

v6[15] = 65

v6[16] = 31

v6[17] = 78

v6[18] = 62

v6[19] = 32

v6[20] = 49

v6[21] = 32

v6[22] = 1

v6[23] = 57

v6[24] = 96

v6[25] = 3

v6[26] = 21

v6[27] = 9

v6[28] = 4

v6[29] = 62

v6[30] = 3

v6[31] = 5

v6[32] = 4

v6[33] = 1

v6[34] = 2

v6[35] = 3

v6[36] = 44

v6[37] = 65

v6[38] = 78

v6[39] = 32

v6[40] = 16

v6[41] = 97

v6[42] = 54

v6[43] = 16

v6[44] = 44

v6[45] = 52

v6[46] = 32

v6[47] = 64

v6[48] = 89

v6[49] = 45

v6[50] = 32

v6[51] = 65

v6[52] = 15

v6[53] = 34

v6[54] = 18

v6[55] = 16

v3[0] = ord('{')

v3[1] = ord(' ')

v3[2] = 18

v3[3] = 98

v3[4] = 119

v3[5] = 108

v3[6] = 65

v3[7] = 41

v3[8] = 124

v3[9] = 80

v3[10] = 125

v3[11] = 38

v3[12] = 124

v3[13] = 111

v3[14] = 74

v3[15] = 49

v3[16] = 83

v3[17] = 108

v3[18] = 94

v3[19] = 108

v3[20] = 84

v3[21] = 6

for i in range(12):

?????? v4[i] = ord("`S,yhn _uec{"[i])

v4[12] = 127

v4[13] = 119

v4[14] = 96

v4[15] = 48

v4[16] = 107

v4[17] = 71

v4[18] = 92

v4[19] = 29

v4[20] = 81

v4[21] = 107

v4[22] = 90

v4[23] = 85

v4[24] = 64

v4[25] = 12

v4[26] = 43

v4[27] = 76

v4[28] = 86

v4[29] = 13

v4[30] = 114

v4[31] = 1

for i in range(32):

?????? v3[22+i] = v4[i]

v3.append(ord("u"))

v3.append(ord("~"))

s = ""

for i in range(56):

?????? v3[i] ^= v6[i]

?????? v3[i] ^= 0x13

?????? s += chr(v3[i])

print(s)

open-source

分析源碼可知

寫Python腳本得到flag

simple-unpack

64位的ELF文件使用ida64打開,分析被中斷,文件被加殼處理過

使用ExeinfoPe進行查殼,發現有upx殼。

使用upx -d進行脫殼

直接看main函數就行

logmein

按位校對是否與異或后的值相等

寫python腳本得到flag

#!/usr/bin python2

#-*-coding=utf-8-*-open

import binascii

v8 = ":\"AL_RT^L*.?+6/46"

v7 = "65626D61726168"

v7=binascii.unhexlify(v7)

v7.decode('utf-8')

#print(v7[-1::-1])

v7 = v7[-1::-1]

v6 = 7

flag = ""

for i in range(0,len(v8)):

?????? flag += chr( ord(v7[i % v6]) ^ ord(v8[i]) )

print(flag)

no-strings-attached

直接看main函數

逐個查看函數代碼,定位到authenticate 看著比較像對flag進行數據處理的。主要是比較 ws 和 s2

靜態調試

按程序邏輯直接導出數據,寫python腳本求解

Shift + E 導出數據

wchar_t是C/C++的字符數據類型,是一種擴展的字符存儲方式。 在Windows下,wchar_t占2個字節(byte);

在Linux下,wchar_t占4個字節。

wchar_t類型主要用在國際化程序的實現中,但它不等同于Unicode編碼。Unicode編碼的字符一般以wchar_t類型存儲。

這里其實只用到了一個字節框起的部分是無用的 寫腳本的時候直接去掉 直接選這個選項可以導出字符

為了方便寫腳本用這個選項導出

#!/usr/bin python3

#-*-coding=utf-8-*-open

a2 = [1,2,3,4,5]

s = [58,54,55,59,128,122,113,120,99,102,115,103,98,101,115,96,107,113,120,106,115,112,100,120,110,112,112,100,112,100,110,123,118,120,106,115,123,128]

flag =''

for i in range(len(s)):

?????? flag += chr(s[i] - a2[i%5])

print(flag)

動態調試

Ollydbg不能調試Linux的ELF可執行文件 可以用ida遠程調試或者用gdb

在ida查看內存,去查找最后生成的字符串。通過IDA生成的匯編指令,可以看出調用decrypt函數后,生成的字符串保存在EAX寄存器中。這就是為什么要在GDB中查看eax寄存器的值

1. gdb 調試

??? gdb 554e0986d6db4c19b56cfdb22f13c834

2. 打斷點 decrypt

??? b decrypt

3. 執行,單步執行

??? r

??? n

4. 查看地址內容(根據代碼分析,數據在 eax)

??? 數值查看???? x/200wd $eax

字符串查看?? x/sw $eax? s -> 字符串 w -> 4字節

b 表示下斷點,gdb 中可以直接用已知函數名下斷點,也可通過*指定地址下斷點。

r 表示程序運行,n 表示單步步過,s 表示單步步入

x 指令表示查看寄存器內容

??? x/<n/f/u>? <addr>

??????? <n>:是正整數,表示需要顯示的內存單元的個數,即從當前地址向后顯示n個內存單元的內

容,

??????? 一個內存單元的大小由第三個參數u定義。

??????? <f>:表示addr指向的內存內容的輸出格式,s對應輸出字符串,此處需特別注意輸出整型數據的格式:

????????? x 按十六進制格式顯示變量.

????????? d 按十進制格式顯示變量。

????????? u 按十進制格式顯示無符號整型。

????????? o 按八進制格式顯示變量。

????????? t 按二進制格式顯示變量。

????????? a 按十六進制格式顯示變量。

????????? c 按字符格式顯示變量。

????????? f 按浮點數格式顯示變量。

??????? <u>:就是指以多少個字節作為一個內存單元-unit,默認為4。u還可以用被一些字符表示:

????????? 如b=1 byte, h=2 bytes, w=4 bytes, g=8 bytes.

??????? <addr>:表示內存地址。

x:就是用來查看內存中數值的,后面的200代表查看多少個,wx代表是以word字節查看看,$eax代表的eax寄存器中的值

getit

就是對s的值按位 加一或者減一 然后賦值到t中間????????的部分

得到s 和 t 的值

#!/usr/bin python3

#-*-coding=utf-8-*-open

s = "c61b68366edeb7bdce3c6820314b7498"

t = "SharifCTF{????????????????????????????????}"

T=list(t)

for i in range(len(s)):

?????? if ( (i & 1) != 0 ):

????????????? v3 = 1

?????? else:

????????????? v3 = -1

?????? T[i+10]=str(chr(ord(s[i])+v3))

flag = "".join(T)

print(flag)

csaw2013reversing2

動態調試

用od調試 為讓程序跳轉到loc_401096調用sub_401000進行解碼,把int3改為nop(0x90),再跳到loc_4010B9進行輸出

搜索字符串找到IsDebuggerPresent()函數地址

把前面的B9改成96 , int3 改成 nop

修改完后點擊運行即可

maze

從上往下以此追蹤,可以發現這些函數會跳到lable15的位置

按R就可以變成字符。輸入的應該是'.','0','o','O',并以此來確定上下左右移動

分析這四個函數

前兩個是對v10進行減和加 實現的是左右的操作 同時判斷是否越界

后兩個函數也是加減但是對v9進行的,實現的是上下操作 同時判斷是否越界

看有個wp說明了v9 v10兩個參數區別

個人感覺這應該是 __int32

Dword類型:DWORD中D表示double,一個word(字)兩個字節(兩個字節16bit),因此DWORD為四個字節,常表示uint32_t。

查看堆棧變量

對lable15分析,發現特殊的字符串,應該就是迷宮的地圖

根據上面四個函數的信息可知是個8x8的迷宮地圖

進入判斷函數內部

a1是一個8*8的數組,并且值由這些組成,a2代表列,a3代表行,a3+1也就是向下走了一個單位

搞明白邏輯之后其實就簡單了,畫出線路圖直接寫就行

o? 0 oo?? 00? O? 000?? oooo?? ..? OO

左 下 左左 下下 右 下下下 左左左左 上上 右右

#flag 即為

nctf{o0oo00O000oooo..OO}

總結

以上是生活随笔為你收集整理的攻防世界re(新1手区)1-12题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。