JCTF 2014 小菜兩碟

2022-01-19 07:16:06 字數 2033 閱讀 4591

測試檔案:

參考文章:

檢測時發現不是pe檔案,但是開啟16進製制卻發現了mz標識,因此我們能夠判斷檔案中存在錯誤。

通過觀察,發現指向pe檔案頭的位址為e9,但是實際的位址卻是e8。

將位址修改正確之後,在010editor開啟檔案,匯入exe模板

可以看到,正確的pe檔案標識應該是0x00004550,但是檔案中是0x00ff4550,修改ff為00

將修改後的檔案儲存為exe檔案

定位到main函式

1

__int64 __cdecl main_0()262

if ( *(&str1 + j) <= 126)63

break

;64 v1 = *(&str1 +j);65}

66}67if ( v24 == 94 && v25 == 98 ) //

v24=94,v25=98

6878}79

if ( !j_strcmp(&str1, "

*&8p^bp^b

") )80"

;85 v12 =v22;

86 v11 =dst;

87 v3 =v20;

88 v15 = &v11;

89 v4 = sub_411154(std::cout, "

jlflag

98label_31:

99 v9 = sub_411154(std::cout, "

please try again!");

100 std::basic_ostream>::operator

<

101goto

label_32;

102}

103}

104label_32:

105 v14 =hidword(v1);

106 v13 = 0

;107

return *(_qword *)&v13;

108 }

通過第90~94行**,我們知道正確的flag為組合[v4 v3 v11 v12 v13 v14],其中v4="jlflag",v14=std::endl

因此我們只需要求出v3,v11,v12即可,通過第85~87行**,我們知道v12 = v22;v11 = dst;v3 = v20;

我們能夠通過這三個變數滿足的三個表示,求出三個數的值。

for v22 in range(100):

for dst in range(100):

for v20 in range(100):

if v22*dst*v20//11 == 106 and (v22 + dst + v20) % 100 == 34:

if (dst^v20) == v22 - 4:

if (v22 + dst + v20) % 100 == 34:

print("

jlflag

"%(v22, dst, v20), end='

\n')

jlflag

jlflag

jlflag

jlflag

jlflag

jlflag

將這6組得到的flag一組一組試,就能得到正確flag。(記得去掉jl

flag

物件導向部分 201

小夥伴們,還在為不知道怎麼下手而頭疼嗎,我們程式競賽協會來幫你們啦 啦啦啦。另外,如果有對程式設計含有濃厚興趣的同學,我們隨時歡迎你們的加入喲 策劃 譚兆飛 程式設計 管懷文 協助 一號人員要求給她打碼 乾脆二號也打碼好了o o 其實只是提供了題目啦 物件導向部分 201 include inclu...

2 01揹包問題

有 nn 件物品和乙個容量是 vv 的揹包。每件物品只能使用一次。第 ii 件物品的體積是 vivi,價值是 wiwi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,vn,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n...

2 01揹包問題

有 nn 件物品和乙個容量是 vv 的揹包。每件物品只能使用一次。第 ii 件物品的體積是 vivi,價值是 wiwi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。第一行兩個整數,n,vn,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 nn 行,每...