CSICTF 部分逆向wpBlaise

2021-10-08 15:55:05 字數 2313 閱讀 1730

整個看下來邏輯就是,隨機出現兩個數,找到他們的最小公因數,然後+3求階乘。(在30s內算完所有即可)

(當時沒有用指令碼,直接計算器走一波就出來了)

附上指令碼:

from pwn import *

from libcsearcher import *

from struct import pack

context.os='linux'

context.arch='amd64'

context.log_level='debug'

sd=lambda x:io.send(x)

sl=lambda x:io.sendline(x)

ru=lambda x:io.recvuntil(x)

rl=lambda :io.recvline()

ra=lambda :io.recv()

rn=lambda x:io.recv(x)

sla=lambda x,y:io.sendlineafter(x,y)

#求最小公因數

def fun1(a,b):

r=0i=1

while true:

if a這題也蠻簡單的,可能是因為太后放出了?做的人好少...(此處簡述一下邏輯,當時做的時候忘記截圖了,也懶得復現了qaq)

邏輯就是隨機給出乙個數k,然後輸入c(n,m)排列組合(m為上標,n為下標),n為給出的隨機數k,m為從0~k(前後其實是對稱的),輸入正確直接get flag...

從這裡開始就都是賽後復現啦:

開啟找到主函式:

函式邏輯很簡單,就是讓str = "hello" 就可以了,然後就發現沒有辦法去直接改變str的值,所以問題的關鍵還是在於jumpout函式上。

由於位址這樣看起來不清晰,所以跑乙個python指令碼處理一下

這裡可以看一下patchdword函式的意思

然後看回ida的dword_402020,現在就變成這樣啦:

看一下對應位址的偏移量,+33為輸入的字元,反過來也可以理解為程式將輸入的字元減去33然後當作下標索引,跳轉到對應位址。

算一下偏移:

位址                        偏移量                 輸入字元(偏移量+33)

0x4012a9                 0                          !(33)

0x40120c                 3                          $(36)

0x40122d                10                         +(43)   

0x4012e6                11                         ,(44)

0x40126b                12                         -(45)

0x4012fb                 13                         .(46)

0x40131e                58                         [(91) 

0x401369                60                         ](93)

看一下彙編,就會發現每個位址的作用:

結合上面我們就可以知道,輸入「,」是將字元放在sa中,輸入「 . "就可以把它存在str中,因為要讓」hello「賦值給str,所以我們需要輸入六個字元(包括"\n"):

在終端輸入:

, . , . , . , . , . , .  (鍵盤輸入)

hello            (鍵盤輸入)

hello            (系統輸出)

csictf(系統輸出)

get flag!

單鏈表部分逆置

題目來自計蒜客c 部分 題目描述 給定乙個固定的單鏈表,輸入兩個數begin和end。將下標為begin到end之間的內容逆置。給定的單鏈表為 0 2 4 6 8 10 12 14 16 18 測試資料確保begin和end不會超出單鏈表的長度範圍,並且end begin 樣例輸入 2 4 樣例輸出...

單鏈表部分逆置

題目描述如下 該程式最關鍵的地方在於reverse函式,這裡使用了兩種實現方式,分別採用了陣列 reverse 及指標 reverse2 的方式,具體實現 如下。include using namespace std struct list list head 陣列實現,時間複雜度和空間複雜度都為o...

Leetcode 鍊錶的部分倒插逆置

將乙個鍊錶m位置到n位置之間的區間反轉,要求使用原地演算法,並且在一次掃瞄之內完成反轉。例如 給出的鍊錶為1 2 3 4 5 null,m 2 n 4,返回1 4 3 2 5 null.注意 給出的m,n滿足以下條件 1 m n 鍊錶長度 基本思路 建立乙個初始的輔助節點 通過pre start s...