看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路
第十三題《機器人歷險記》在今天(12月27日)中午12:00 結束攻擊!只有兩支團隊成功破解防守方的題目。
Ta們是冠軍熱門人選:tekkens 和 中午放題搬磚狗哭哭,其中 tekkens以 78857s 的成績奪得本題第一名!
本題結束後,出題團隊飄向北方 位居防守團隊總排行榜第二名。
防守團隊排行榜如下:
最新賽況戰況一覽
第十三題之後,攻擊方最新排名情況如下:
中午放題搬磚狗哭哭名列榜首, tekkens上升一名至第二名,金左手下降一名至第三名,111new111從第十名上升至第六名,進步很大~!
迴歸第二名的 tekkens 會是 中午放題搬磚狗哭哭 最大的威脅嗎?
最後兩題會改變哪些團隊的命運?
第十三題 點評
crownless:
“機器人歷險記”此題的主程式特立獨行地採用了MIPS架構,因此考驗了參賽者的MIPS反彙編水平。另外,題目使用素域64bit弱橢圓曲線,要求參賽者掌握相關的密碼學知識。總的來說,這道題風格獨特。
第十三題 出題團隊簡介
出題團隊:飄向北方
飄向北方,團隊就我一個人,之所以叫這個名字是因為這段時間很喜歡這首歌,我目前在在做智慧加密裝置的開發,對這塊有所瞭解,而且在學習的過程中,得到了看雪論壇的很多幫助,所以出了這樣一道題目。
第十三題 設計思路
由看雪論壇gxustudent 原創
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
第十三題 機器人歷險記 解題思路
本題解析由看雪論壇風間仁 原創。
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 結束
趕緊參與進來吧~!
合作伙伴
騰訊安全應急響應中心
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 團隊賽 第二題 『半加器』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第九題『諜戰』 解題思路2018-12-19
- 看雪CTF.TSRC 2018 團隊賽 第七題 『魔法森林』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第五題 『交響曲』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第六題 『追凶者也』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第八題 『二向箔』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第十題『俠義雙雄』 解題思路2018-12-21
- 看雪CTF.TSRC 2018 團隊賽 第三題 『七十二疑冢』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第四題 『盜夢空間』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第十一題『伊甸園』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第十四題『 你眼中的世界』 解題思路2018-12-29
- 看雪CTF.TSRC 2018 團隊賽 第十五題『 密碼風雲』 解題思路2019-01-02密碼
- 看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路2018-12-25
- 看雪CTF.TSRC 2018 團隊賽 獲獎名單公示2019-01-02
- 看雪.紐盾 KCTF 2019 Q3 | 第十三題點評及解題思路2019-10-08
- 看雪·眾安 2021 KCTF 秋季賽 | 第十題設計思路及解析2021-12-16
- 看雪·眾安 2021 KCTF 秋季賽 | 第九題設計思路及解析2021-12-09
- 看雪·眾安 2021 KCTF 秋季賽 | 第七題設計思路及解析2021-12-03
- 看雪·眾安 2021 KCTF 秋季賽 | 第六題設計思路及解析2021-12-01
- 看雪·眾安 2021 KCTF 秋季賽 | 第五題設計思路及解析2021-11-29
- 看雪·眾安 2021 KCTF 秋季賽 | 第四題設計思路及解析2021-11-25
- 看雪·眾安 2021 KCTF 秋季賽 | 第三題設計思路及解析2021-11-22
- 看雪·深信服 2021 KCTF 春季賽 | 第十題設計思路及解析2021-05-31
- 看雪·深信服 2021 KCTF 春季賽 | 第七題設計思路及解析2021-05-25
- 看雪·深信服 2021 KCTF 春季賽 | 第八題設計思路及解析2021-05-25
- 看雪·深信服 2021 KCTF 春季賽 | 第九題設計思路及解析2021-05-28
- 看雪·深信服 2021 KCTF 春季賽 | 第六題設計思路及解析2021-05-21
- 看雪·深信服 2021 KCTF 春季賽 | 第三題設計思路及解析2021-05-14
- 看雪·深信服 2021 KCTF 春季賽 | 第四題設計思路及解析2021-05-17
- 看雪·深信服 2021 KCTF 春季賽 | 第五題設計思路及解析2021-05-17
- 看雪·深信服 2021 KCTF 春季賽 | 第二題設計思路及解析2021-05-12
- 看雪·眾安 2021 KCTF 秋季賽 | 第十一題設計思路及解析2021-12-15
- 看雪.紐盾 KCTF 2019 Q3 | 第四題點評及解題思路2019-09-29
- 看雪.紐盾 KCTF 2019 Q3 | 第七題點評及解題思路2019-09-30
- 看雪.紐盾 KCTF 2019 Q3 | 第一題點評及解題思路2019-09-25
- 看雪.紐盾 KCTF 2019 Q3 | 第六題點評及解題思路2019-10-08
- 看雪.紐盾 KCTF 2019 Q3 | 第八題點評及解題思路2019-10-08