看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路

Editor發表於2018-12-27

看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路


第十三題《機器人歷險記》在今天(12月27日)中午12:00 結束攻擊!只有兩支團隊成功破解防守方的題目。


Ta們是冠軍熱門人選:tekkens 和 中午放題搬磚狗哭哭,其中 tekkens以 78857s 的成績奪得本題第一名!


本題結束後,出題團隊飄向北方 位居防守團隊總排行榜第二名。


防守團隊排行榜如下:


看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路


最新賽況戰況一覽


第十三題之後,攻擊方最新排名情況如下:


看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路


中午放題搬磚狗哭哭名列榜首, tekkens上升一名至第二名,金左手下降一名至第三名,111new111從第十名上升至第六名,進步很大~!


迴歸第二名的 tekkens 會是 中午放題搬磚狗哭哭 最大的威脅嗎?


最後兩題會改變哪些團隊的命運?



第十三題 點評


crownless:

“機器人歷險記”此題的主程式特立獨行地採用了MIPS架構,因此考驗了參賽者的MIPS反彙編水平。另外,題目使用素域64bit弱橢圓曲線,要求參賽者掌握相關的密碼學知識。總的來說,這道題風格獨特。


第十三題 出題團隊簡介


出題團隊:飄向北方 


飄向北方,團隊就我一個人,之所以叫這個名字是因為這段時間很喜歡這首歌,我目前在在做智慧加密裝置的開發,對這塊有所瞭解,而且在學習的過程中,得到了看雪論壇的很多幫助,所以出了這樣一道題目。


看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路



第十三題 設計思路


由看雪論壇gxustudent 原創


看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路


1. 題目答案:

3f43ed6ff36724ca56e16038e692b5d75f1524ad31c1c5667111e3d30e553e0e



2. 題目設計說明:


題目使用素域64bit弱橢圓曲線,曲線引數如下:

p:  "8d5b53dd2e70fc93"

a:  "348020e40410f914"

b:  "22bb96de83b3eb71"

Gx: "1323f564d7976e65"

Gy: "2a193d3e7a6b1e29"

n:  "8d5b53dd4b7d51eb"

h:  "01"


該引數可以通過檢視二進位制檔案的字串直接獲得;


答案分為兩部分:


第一部分為根據字串"Welcome to KanXue CTF 2018"使用橢圓曲線演算法(ECDSA)進行簽名所得到的簽名值的R和S。


生成R和S需要曲線私鑰, 為了減少破解時間,使用弱私鑰0xF377F,私鑰可以使用暴力窮舉在1分鐘內得到;


公鑰可以通過反彙編程式得到。同時。(因為ECC可以有不同的簽名)為了防止出現多組答案,會對輸入的頭16個字元和xor加密後的答案進行比較。另外,程式中有關於ECDSA的提示:


"hint:k is 5532091271463842210;",其中k值是ECC標準X9.62中用於計算簽名R值的k。


第二部分為橢圓曲線上的點A的X座標和Y座標,該點與橢圓曲線上的固定點B相加得到橢圓曲線上的固定點C;


求該點的辦法為執行橢圓曲線減法: A=C-B


點B和點C的值可以通過檢視二進位制檔案的字串直接得到。


題目執行時需要先安裝qemu。



題目執行命令如下:

qemu-system-mips -kernel ./vmlinux -hda  rootfs.img -append "root=/dev/sda console=ttyS0" -serial stdio -m 256


題目提供兩個檔案:

rootfs.img:  檔案系統檔案

vmlinux      linux核心檔案


需要反編譯的檔案在檔案系統/bin/kanxuectf2018中,大小為246k,使用mips指令集

檔案系統為ext4檔案格式。


題目有兩種反除錯手段:

# ptrace反除錯

# SIGTRAP反除錯


3. 破解思路

3.1 通過反彙編拿到曲線引數, 曲線公鑰,C點座標, B點座標;

3.2 暴力窮舉得到私鑰,進行簽名,得到答案第一部分;

3.3 C- B 得到答案第二部分。


原文連結:

https://bbs.pediy.com/thread-247857.htm



第十三題  機器人歷險記 解題思路


本題解析由看雪論壇風間仁 原創。


看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路


1. 總體邏輯

sn格式:[r][s][P0_x][P0_y]

(r,s)為ecdsa簽名,P0為橢圓曲線上的點


橢圓曲線:y^2=x^3+ax+b 

已知G(基點), R(公鑰),a, b, p, n, h(hash), r

求解s


橢圓曲線相關知識參考: 

https://bbs.pediy.com/thread-152615.htm


(1)簽名

h為要簽名的hash, 私鑰為d, 公鑰R = d*G

隨機數k , 範圍在(1, n)

r = k * G mod n

s = (h + rd)/k mod n


(2)驗證

u = h/s

w = r/s

v = u * G + w * R mod n

驗證v == r


2. IDA除錯

qemu-mips -g 23946 ./kanxuectf2018

IDA除錯選擇"Remote GDB debugger", 下好斷點附加上去


3. 初始化

橢圓曲線引數初始化


G: (1323f564d7976e65, 2A193D3E7A6B1E29)

a: 348020e40410f914

b: 22bb96de83b3eb71

p: 8d5b53dd2e70fc93

n: 8d5b53dd4b7d51eb



.text:004069F8 x_init

.text:00403430  la $v0, g_NP        # "8d5b53dd4b7d51eb"

.text:00403438  sw $v0, 0x38+var_1C($sp)

.text:0040343C  la $v0, g_G_y       # "2a193d3e7a6b1e29"

.text:00403444  sw $v0, 0x38+var_20($sp)

.text:00403448  la $v0, g_G_x       # "1323f564d7976e65"

.text:00403450  sw $v0, 0x38+var_24($sp)

.text:00403454  la $v0, g_B         # "22bb96de83b3eb71"

.text:0040345C  sw $v0, 0x38+var_28($sp)

.text:00403460 lui     $v0, 0x43  # 'C'

.text:00403464 addiu   $a3, $v0, (g_A - 0x430000)  # "348020e40410f914"

.text:00403468 lui     $v0, 0x43  # 'C'

.text:0040346C addiu   $a2, $v0, (g_P - 0x430000)  # "8d5b53dd2e70fc93"

.text:00403470 lui     $v0, 0x43  # 'C'

.text:00403474 addiu   $a1, $v0, (a8d5b53d - 0x430000)  # "8d5b53d"

.text:00403478  lw $a0, 0x38+arg_0($fp)

.text:0040347C  la $v0, ecurve_init

.text:00403480 nop

.text:00403484  move $t9, $v0

.text:00403488 bal     ecurve_init


隨機數k的提示


x_decrypt_k_hint這個函式不會被呼叫


xor_buf(g_k_hint_enc, "Welcome to KanXue CTF 2018") 


得到k: 4CC5EFB37CA431A2


.text:00406A68                 addiu $a1, $v0, (x_decrypt_k_hint - 0x400000)

.text:00406A6C                 li$a0, 5

.text:00406A70                 la$v0, sub_430370

.text:00406A74                 nop

.text:00406A78                 move$t9, $v0

.text:00406A7C                 jalr$t9 ; sub_430370

.rodata:00436F80 g_k_hint_enc




4. sn長度驗證


0x10 <= len(sn) < 0x81

.text:00405C1C  lw $v0, 0x430+sn_len($fp)

.text:00405C20 nop

.text:00405C24 sltiu   $v0, 0x81

.text:00405C28 beqz    $v0, loc_405DDC

.text:00405C2C nop

.text:00405C30  lw $v0, 0x430+sn_len($fp)

.text:00405C34 nop

.text:00405C38 sltiu   $v0, 0x10

.text:00405C3C bnez    $v0


5. 驗證r


xor_buf(g_r_enc, "Welcome to KanXue CTF 2018") == hex2bin(sn[0:16])


得到r: 3f43ed6ff36724ca (根據這個可知sn是全部小寫的)


.text:00405CAC addiu   $v0, $fp, 0x430+sn

.text:00405CB0  move $a0, $v0

.text:00405CB4 jal     x_verify_r

.rodata:00436FA0 g_r_enc



6. 驗證簽名(h,r,s)


G: (1323f564d7976e65, 2A193D3E7A6B1E29)

R: (3ed6cee8b10a0da1, 11c6014cdcc1fd13)

h = mpz(sha1("Welcome to KanXue CTF 2018")) % p = 2ABB294436DE91F4


ecdsa_verify(h, r, s)

.text:00405D30 jal     x_verify_sign

公鑰R

.text:004066EC bal     epoint_set

.rodata:00436FD8 g_R

epoint_set中根據y的計算方式可知是橢圓曲線

y=(x^3+ax+b)^((p+1)/4) % p

因為p是素數, 所以 x^p % p = x

y^4=(x^3+ax+b)^((p+1)) % p=(x^3+ax+b)^2 % p

y^2=(x^3+ax+b) % p

計算h

.text:004066F8  la $v0, aWelcomeToKanxu  # "Welcome to KanXue CTF 2018"

.text:00406714 bal     sha1

.text:00406760 bal     mpz_init_set_str

.text:004067D8 bal     mpz_mod

驗證簽名

.text:00406974 bal     ecdsa_verify

u = h/s

.text:00405638 bal     mpz_invert

.text:0040566C bal     mpz_mod

.text:0040569C bal     mpz_mul

.text:004056D4 bal     mpz_mod

w = r/s

.text:00405704 bal     mpz_mul

.text:0040573C bal     mpz_mod

u*G

.text:00405774 bal     ecurve_mult

w*R

.text:004057A0 bal     ecurve_mult

v = u * G + w * R mod n

v == r

.text:004057C8 bal     ecurve_add

.text:004057F4 bal

根據 R = d*G 窮舉私鑰d, 得到d: F377F

#include <miracl.h>

void test_d()

{

big a = mirvar(0);

big b = mirvar(0);

big p = mirvar(0);

cinstr(a, "348020E40410F914");

cinstr(b, "22BB96DE83B3EB71");

cinstr(p, "8D5B53DD2E70FC93");

ecurve_init(a, b, p, MR_AFFINE);

big G_x = mirvar(0);

big G_y = mirvar(0);

cinstr(G_x, "1323f564d7976e65");

cinstr(G_y, "2A193D3E7A6B1E29");

epoint* G = epoint_init();

if (!epoint_set(G_x, G_y, 0, G))

{

return;

}

big R_x = mirvar(0);

cinstr(R_x, "3ed6cee8b10a0da1");

big d = mirvar(0);

big x = mirvar(0);

epoint* ep = epoint_init();

char tmp[256];

for (DWORD64 i = 0x1; i < 0x8d5b53dd4b7d51eb; i++)

{

sprintf(tmp, "%016I64x", i);

cinstr(d, tmp);

ecurve_mult(d, G, ep);

epoint_get(ep, x, x);

if (compare(x, R_x) == 0)

{

print_big(d); // F377F

break;

}

}

}

計算sign

h:  2ABB294436DE91F4

r: 3f43ed6ff36724ca

d: F377F

k:  4CC5EFB37CA431A2

n: 8d5b53dd4b7d51eb

s = (h + rd)/k mod n


得到s: 56e16038e692b5d7


void test_sign()

{

big n = mirvar(0);

big d = mirvar(0);

big h = mirvar(0);

big k = mirvar(0);

big k_inv = mirvar(0);

big r = mirvar(0);

cinstr(n, "8d5b53dd4b7d51eb");

cinstr(d, "0F377F");

cinstr(h, "2ABB294436DE91F4");

cinstr(k, "4CC5EFB37CA431A2");

invert(k, n, k_inv);

cinstr(r, "3f43ed6ff36724ca");

multiply(r, d, r);

add(r, h, r);

multiply(r, k_inv, r);

divide(r, n, n);

print_big(r);

}


7. 驗證(P0_x, P0_y)


P0, P1, P2為橢圓曲線上的點

P1: (5aec40380efb5c07, 1C3F07414C1B41C2)

P2: ( 79bd33edc62545df, 538788838577ED90 )

P0 + P1 == P2, 得到P0: (5F1524AD31C1C566, 7111E3D30E553E0E)


.text:00405D80 jal     x_verify_P0

P0 + P1 == P2

.text:00406460 bal     epoint_set

.text:00406490 bal     epoint_set

.text:004064C4 bal     ecurve_add

.text:004064F0 bal     mpz_cmp

.text:00406530 bal     mpz_cmp

.rodata:00436FB0 g_P1

.rodata:00436FC4 g_P2



得到sn:


3f43ed6ff36724ca56e16038e692b5d75f1524ad31c1c5667111e3d30e553e0e


[r][s][P0_x][P0_y] 中除了r之外, 其他16進位制字元轉換時沒有驗證大小寫, 所以存在多解。


原文連結:

https://bbs.pediy.com/thread-248656.htm



第十四題【 你眼中的世界】正在火熱進行中

第14題/共15題

《你眼中的世界》將於 12月29 日中午 12:00 結束

趕緊參與進來吧~!


合作伙伴 

看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路


騰訊安全應急響應中心 

TSRC,騰訊安全的先頭兵,肩負騰訊公司安全漏洞、黑客入侵的發現和處理工作。這是個沒有硝煙的戰場,我們與兩萬多名安全專家並肩而行,捍衛全球億萬使用者的資訊、財產安全。一直以來,我們懷揣感恩之心,努力構建開放的TSRC交流平臺,回饋安全社群。未來,我們將繼續攜手安全行業精英,探索網際網路安全新方向,建設網際網路生態安全,共鑄“網際網路+”新時代。

看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路

看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路



轉載請註明:轉自看雪學院



看雪CTF.TSRC 2018 團隊賽 解題思路彙總: 


看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路


看雪CTF.TSRC 2018 團隊賽 第二題 『半加器』 解題思路


看雪CTF.TSRC 2018 團隊賽 第三題 『七十二疑冢』 解題思路


看雪CTF.TSRC 2018 團隊賽 第四題 『盜夢空間』 解題思路


看雪CTF.TSRC 2018 團隊賽 第五題 『交響曲』 解題思路


看雪CTF.TSRC 2018 團隊賽 第六題 『追凶者也』 解題思路


看雪CTF.TSRC 2018 團隊賽 第七題 『魔法森林』 解題思路


看雪CTF.TSRC 2018 團隊賽 第八題 『二向箔』 解題思路


看雪CTF.TSRC 2018 團隊賽 第九題『諜戰』 解題思路


看雪CTF.TSRC 2018 團隊賽 第十題『俠義雙雄』 解題思路


看雪CTF.TSRC 2018 團隊賽 第十一題『伊甸園』 解題思路


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路



相關文章