整個看下來邏輯就是,隨機出現兩個數,找到他們的最小公因數,然後+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...