roaris / ctf-log

0 stars 0 forks source link

zer0pts CTF 2023 : decompile me #76

Open roaris opened 2 days ago

roaris commented 2 days ago

https://alpacahack.com/challenges/decompile-me

roaris commented 2 days ago
$ file chall
chall: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=2ab445e9f70698730020147cd5891e52c3ad234c, for GNU/Linux 3.2.0, not stripped

$ ./chall
FLAG: test
Wrong...
roaris commented 1 day ago

main関数 image

RC4_setkeyとRC4_encryptが気になる RC4はストリーム暗号の一種で、鍵ストリーム(疑似乱数列)と平文のxorで暗号化する https://zenn.dev/mahiro33/articles/6f74d1dc8532b4

roaris commented 1 day ago

read関数の引数にrspが渡されていることから、入力文字列はrspに格納されることが分かる

RC4_encrypt関数の引数には、rsp(入力文字列)とrsp+0x80が渡される rsp+0x80に暗号化結果が格納されると推測出来る

memcmp関数で、rsp+0x80に格納されたバイト列と特定のバイト列との比較をしている 一致していればCorrect!と表示され、一致していなければWrong...と表示される

roaris commented 1 day ago

RC4_encrypt関数 r13, r14, r15とか出てくる一方で、引数のrsi, rdiが使われていない しかし、main関数の上の方を見ると、r15がrsp, r14がrsp+0x80となっていることが分かる image

ecxがループ変数になっていて、0x80回ループが回っている xor al, [r15+rcx]; mov [r14+rcx], al;が重要な部分で、鍵ストリームと平文のxorを表している

roaris commented 1 day ago

鍵ストリームはr13を元に作っている RC4_setkey関数を見ると、r13に対して何かしら処理している image この問題を解くうえでは、ここの処理を理解する必要はない

roaris commented 1 day ago

楽な解法は、aaa...aaa(0x80文字)を入力として与えて、RC4_encrypt関数の暗号化結果とaaa...aaaのxorから鍵ストリームを求めて、比較対象のバイト列と鍵ストリームのxorから平文を求めるというものである

罠があって、memcmp関数には引数が2つ渡されているが(rsiとrdiで、rdiはRC4_encrypt関数の暗号化結果)、rsiの方はmemcmp関数内で上書きされている image

以下のように、gdbを使って、memcmp関数で比較される2つのバイト列を取得する

$ gdb -q chall
Reading symbols from chall...
(No debugging symbols found in chall)
gdb-peda$ b *(main+0xa2)
Breakpoint 1 at 0x12bd
gdb-peda$ r
Starting program: /home/roaris/alpacahack/decompile-me/chall
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
FLAG: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Warning: 'set logging off', an alias for the command 'set logging enabled', is deprecated.
Use 'set logging enabled off'.

Warning: 'set logging on', an alias for the command 'set logging enabled', is deprecated.
Use 'set logging enabled on'.
[----------------------------------registers-----------------------------------]
RAX: 0x20 (' ')
RBX: 0xbf
RCX: 0x80
RDX: 0x80
RSI: 0x555555556025 --> 0xd08c8897cfdc0908
RDI: 0x7fffffffdde0 --> 0x561526cdd4d7cb63
RBP: 0x555555556004 --> 0x4300203a47414c46 ('FLAG: ')
RSP: 0x7fffffffdd60 ('a' <repeats 128 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310", <incomplete sequence \357>...)
RIP: 0x5555555552bd (<main+162>:        call   0x55555555515b <memcmp>)
R8 : 0x555555555360 (<__libc_csu_fini>: endbr64)
R9 : 0x7ffff7fcfb10 (<_dl_fini>:        push   r15)
R10: 0x7ffff7fcb858 --> 0xa00120000000e
R11: 0x246
R12: 0x555555557f78 --> 0x1145141919810931
R13: 0x7fffffffde60 --> 0xded192f35af946e6
R14: 0x7fffffffdde0 --> 0x561526cdd4d7cb63
R15: 0x7fffffffdd60 ('a' <repeats 128 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310", <incomplete sequence \357>...)
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x5555555552a9 <main+142>:   mov    edx,0x80
   0x5555555552ae <main+147>:   lea    rsi,[rip+0xd70]        # 0x555555556025
   0x5555555552b5 <main+154>:   lea    rdi,[rsp+0x80]
=> 0x5555555552bd <main+162>:   call   0x55555555515b <memcmp>
   0x5555555552c2 <main+167>:   test   rax,rax
   0x5555555552c5 <main+170>:   jne    0x5555555552d5 <.wrong_flag>
   0x5555555552c7 <main+172>:   lea    rdi,[rip+0xd3d]        # 0x55555555600b
   0x5555555552ce <main+179>:   call   0x555555555030 <puts@plt>
Guessed arguments:
arg[0]: 0x7fffffffdde0 --> 0x561526cdd4d7cb63
arg[1]: 0x555555556025 --> 0xd08c8897cfdc0908
arg[2]: 0x80
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffdd60 ('a' <repeats 128 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310", <incomplete sequence \357>...)
0008| 0x7fffffffdd68 ('a' <repeats 120 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320", <incomplete sequence \362>...)
0016| 0x7fffffffdd70 ('a' <repeats 112 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w"...)
0024| 0x7fffffffdd78 ('a' <repeats 104 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377"...)
0032| 0x7fffffffdd80 ('a' <repeats 96 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322", <incomplete sequence \362>...)
0040| 0x7fffffffdd88 ('a' <repeats 88 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322\362wץ\031\245\303s\263"...)
0048| 0x7fffffffdd90 ('a' <repeats 80 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322\362wץ\031\245\303s\263\216\3205y\234\027", <incomplete sequence \302>...)
0056| 0x7fffffffdd98 ('a' <repeats 72 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322\362wץ\031\245\303s\263\216\3205y\234\0270\302?6\3319*\177\203 "...)
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value

Breakpoint 1, 0x00005555555552bd in main ()
gdb-peda$
gdb-peda$ s
[----------------------------------registers-----------------------------------]
RAX: 0x20 (' ')
RBX: 0xbf
RCX: 0x80
RDX: 0x80
RSI: 0x555555556025 --> 0xd08c8897cfdc0908
RDI: 0x7fffffffdde0 --> 0x561526cdd4d7cb63
RBP: 0x555555556004 --> 0x4300203a47414c46 ('FLAG: ')
RSP: 0x7fffffffdd58 --> 0x5555555552c2 (<main+167>:     test   rax,rax)
RIP: 0x55555555515b (<memcmp>:  xor    eax,eax)
R8 : 0x555555555360 (<__libc_csu_fini>: endbr64)
R9 : 0x7ffff7fcfb10 (<_dl_fini>:        push   r15)
R10: 0x7ffff7fcb858 --> 0xa00120000000e
R11: 0x246
R12: 0x555555557f78 --> 0x1145141919810931
R13: 0x7fffffffde60 --> 0xded192f35af946e6
R14: 0x7fffffffdde0 --> 0x561526cdd4d7cb63
R15: 0x7fffffffdd60 ('a' <repeats 128 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310", <incomplete sequence \357>...)
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x555555555156 <read+10>:    xor    eax,eax
   0x555555555158 <read+12>:    syscall
   0x55555555515a <read+14>:    ret
=> 0x55555555515b <memcmp>:     xor    eax,eax
   0x55555555515d <memcmp+2>:   xor    ecx,ecx
   0x55555555515f <memcmp+4>:   lea    rsi,[rip+0x2e1a]        # 0x555555557f80
   0x555555555166 <lx>: mov    bl,BYTE PTR [r14+rcx*1]
   0x55555555516a <lx+4>:       xor    bl,BYTE PTR [rsi+rcx*1]
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffdd58 --> 0x5555555552c2 (<main+167>:    test   rax,rax)
0008| 0x7fffffffdd60 ('a' <repeats 128 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310", <incomplete sequence \357>...)
0016| 0x7fffffffdd68 ('a' <repeats 120 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320", <incomplete sequence \362>...)
0024| 0x7fffffffdd70 ('a' <repeats 112 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w"...)
0032| 0x7fffffffdd78 ('a' <repeats 104 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377"...)
0040| 0x7fffffffdd80 ('a' <repeats 96 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322", <incomplete sequence \362>...)
0048| 0x7fffffffdd88 ('a' <repeats 88 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322\362wץ\031\245\303s\263"...)
0056| 0x7fffffffdd90 ('a' <repeats 80 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322\362wץ\031\245\303s\263\216\3205y\234\027", <incomplete sequence \302>...)
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
0x000055555555515b in memcmp ()
gdb-peda$ n
[----------------------------------registers-----------------------------------]
RAX: 0x0
RBX: 0xbf
RCX: 0x80
RDX: 0x80
RSI: 0x555555556025 --> 0xd08c8897cfdc0908
RDI: 0x7fffffffdde0 --> 0x561526cdd4d7cb63
RBP: 0x555555556004 --> 0x4300203a47414c46 ('FLAG: ')
RSP: 0x7fffffffdd58 --> 0x5555555552c2 (<main+167>:     test   rax,rax)
RIP: 0x55555555515d (<memcmp+2>:        xor    ecx,ecx)
R8 : 0x555555555360 (<__libc_csu_fini>: endbr64)
R9 : 0x7ffff7fcfb10 (<_dl_fini>:        push   r15)
R10: 0x7ffff7fcb858 --> 0xa00120000000e
R11: 0x246
R12: 0x555555557f78 --> 0x1145141919810931
R13: 0x7fffffffde60 --> 0xded192f35af946e6
R14: 0x7fffffffdde0 --> 0x561526cdd4d7cb63
R15: 0x7fffffffdd60 ('a' <repeats 128 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310", <incomplete sequence \357>...)
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x555555555158 <read+12>:    syscall
   0x55555555515a <read+14>:    ret
   0x55555555515b <memcmp>:     xor    eax,eax
=> 0x55555555515d <memcmp+2>:   xor    ecx,ecx
   0x55555555515f <memcmp+4>:   lea    rsi,[rip+0x2e1a]        # 0x555555557f80
   0x555555555166 <lx>: mov    bl,BYTE PTR [r14+rcx*1]
   0x55555555516a <lx+4>:       xor    bl,BYTE PTR [rsi+rcx*1]
   0x55555555516d <lx+7>:       or     al,bl
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffdd58 --> 0x5555555552c2 (<main+167>:    test   rax,rax)
0008| 0x7fffffffdd60 ('a' <repeats 128 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310", <incomplete sequence \357>...)
0016| 0x7fffffffdd68 ('a' <repeats 120 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320", <incomplete sequence \362>...)
0024| 0x7fffffffdd70 ('a' <repeats 112 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w"...)
0032| 0x7fffffffdd78 ('a' <repeats 104 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377"...)
0040| 0x7fffffffdd80 ('a' <repeats 96 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322", <incomplete sequence \362>...)
0048| 0x7fffffffdd88 ('a' <repeats 88 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322\362wץ\031\245\303s\263"...)
0056| 0x7fffffffdd90 ('a' <repeats 80 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322\362wץ\031\245\303s\263\216\3205y\234\027", <incomplete sequence \302>...)
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
0x000055555555515d in memcmp ()
gdb-peda$ n
[----------------------------------registers-----------------------------------]
RAX: 0x0
RBX: 0xbf
RCX: 0x0
RDX: 0x80
RSI: 0x555555556025 --> 0xd08c8897cfdc0908
RDI: 0x7fffffffdde0 --> 0x561526cdd4d7cb63
RBP: 0x555555556004 --> 0x4300203a47414c46 ('FLAG: ')
RSP: 0x7fffffffdd58 --> 0x5555555552c2 (<main+167>:     test   rax,rax)
RIP: 0x55555555515f (<memcmp+4>:        lea    rsi,[rip+0x2e1a]        # 0x555555557f80)
R8 : 0x555555555360 (<__libc_csu_fini>: endbr64)
R9 : 0x7ffff7fcfb10 (<_dl_fini>:        push   r15)
R10: 0x7ffff7fcb858 --> 0xa00120000000e
R11: 0x246
R12: 0x555555557f78 --> 0x1145141919810931
R13: 0x7fffffffde60 --> 0xded192f35af946e6
R14: 0x7fffffffdde0 --> 0x561526cdd4d7cb63
R15: 0x7fffffffdd60 ('a' <repeats 128 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310", <incomplete sequence \357>...)
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x55555555515a <read+14>:    ret
   0x55555555515b <memcmp>:     xor    eax,eax
   0x55555555515d <memcmp+2>:   xor    ecx,ecx
=> 0x55555555515f <memcmp+4>:   lea    rsi,[rip+0x2e1a]        # 0x555555557f80
   0x555555555166 <lx>: mov    bl,BYTE PTR [r14+rcx*1]
   0x55555555516a <lx+4>:       xor    bl,BYTE PTR [rsi+rcx*1]
   0x55555555516d <lx+7>:       or     al,bl
   0x55555555516f <lx+9>:       inc    ecx
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffdd58 --> 0x5555555552c2 (<main+167>:    test   rax,rax)
0008| 0x7fffffffdd60 ('a' <repeats 128 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310", <incomplete sequence \357>...)
0016| 0x7fffffffdd68 ('a' <repeats 120 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320", <incomplete sequence \362>...)
0024| 0x7fffffffdd70 ('a' <repeats 112 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w"...)
0032| 0x7fffffffdd78 ('a' <repeats 104 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377"...)
0040| 0x7fffffffdd80 ('a' <repeats 96 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322", <incomplete sequence \362>...)
0048| 0x7fffffffdd88 ('a' <repeats 88 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322\362wץ\031\245\303s\263"...)
0056| 0x7fffffffdd90 ('a' <repeats 80 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322\362wץ\031\245\303s\263\216\3205y\234\027", <incomplete sequence \302>...)
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
0x000055555555515f in memcmp ()
gdb-peda$ n
[----------------------------------registers-----------------------------------]
RAX: 0x0
RBX: 0xbf
RCX: 0x0
RDX: 0x80
RSI: 0x555555557f80 --> 0x4c0733dc85c4cf78
RDI: 0x7fffffffdde0 --> 0x561526cdd4d7cb63
RBP: 0x555555556004 --> 0x4300203a47414c46 ('FLAG: ')
RSP: 0x7fffffffdd58 --> 0x5555555552c2 (<main+167>:     test   rax,rax)
RIP: 0x555555555166 (<lx>:      mov    bl,BYTE PTR [r14+rcx*1])
R8 : 0x555555555360 (<__libc_csu_fini>: endbr64)
R9 : 0x7ffff7fcfb10 (<_dl_fini>:        push   r15)
R10: 0x7ffff7fcb858 --> 0xa00120000000e
R11: 0x246
R12: 0x555555557f78 --> 0x1145141919810931
R13: 0x7fffffffde60 --> 0xded192f35af946e6
R14: 0x7fffffffdde0 --> 0x561526cdd4d7cb63
R15: 0x7fffffffdd60 ('a' <repeats 128 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310", <incomplete sequence \357>...)
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x55555555515b <memcmp>:     xor    eax,eax
   0x55555555515d <memcmp+2>:   xor    ecx,ecx
   0x55555555515f <memcmp+4>:   lea    rsi,[rip+0x2e1a]        # 0x555555557f80
=> 0x555555555166 <lx>: mov    bl,BYTE PTR [r14+rcx*1]
   0x55555555516a <lx+4>:       xor    bl,BYTE PTR [rsi+rcx*1]
   0x55555555516d <lx+7>:       or     al,bl
   0x55555555516f <lx+9>:       inc    ecx
   0x555555555171 <lx+11>:      cmp    ecx,edx
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffdd58 --> 0x5555555552c2 (<main+167>:    test   rax,rax)
0008| 0x7fffffffdd60 ('a' <repeats 128 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310", <incomplete sequence \357>...)
0016| 0x7fffffffdd68 ('a' <repeats 120 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320", <incomplete sequence \362>...)
0024| 0x7fffffffdd70 ('a' <repeats 112 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w"...)
0032| 0x7fffffffdd78 ('a' <repeats 104 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377"...)
0040| 0x7fffffffdd80 ('a' <repeats 96 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322", <incomplete sequence \362>...)
0048| 0x7fffffffdd88 ('a' <repeats 88 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322\362wץ\031\245\303s\263"...)
0056| 0x7fffffffdd90 ('a' <repeats 80 times>, "c\313\327\324\315&\025V\226d\364:F\260\353\236>\2636!\344\b\226\321\305CK\214\032\fx\250\350\3667<\f\230\234#\321\362P\221\t\241\"YfSh6\273S%\256\254\356\204ނ\267\3328\373\v\345\344\262C\310\357ԋ\3346\277\320\r\362\205\025\021\315{b\270w\376\335\366\232\344\270\307\377\265\267c8\264I\322\362wץ\031\245\303s\263\216\3205y\234\027", <incomplete sequence \302>...)
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
0x0000555555555166 in lx ()
gdb-peda$ x/128bx $rsi
0x555555557f80: 0x78    0xcf    0xc4    0x85    0xdc    0x33    0x07    0x4c
0x555555557f88: 0x93    0x35    0xfb    0x7c    0x10    0x8e    0xbe    0x93
0x555555557f90: 0x28    0xe6    0x2e    0x75    0xda    0x5e    0x85    0xc5
0x555555557f98: 0x91    0x15    0x75    0x89    0x48    0x0e    0x29    0xa4
0x555555557fa0: 0xf9    0xa6    0x3a    0x6e    0x1f    0x84    0xf7    0x42
0x555555557fa8: 0xb0    0x93    0x31    0xf0    0x68    0xc0    0x43    0x38
0x555555557fb0: 0x07    0x32    0x09    0x57    0xda    0x32    0x44    0xcf
0x555555557fb8: 0xcd    0x8f    0xe5    0xbf    0xe3    0xd6    0xbb    0x59
0x555555557fc0: 0x9a    0x6a    0x84    0x85    0xd3    0x22    0xa9    0x8e
0x555555557fc8: 0xb5    0xea    0xbd    0x57    0xde    0xb1    0x6c    0x93
0x555555557fd0: 0xe4    0x74    0x70    0xac    0x1a    0x03    0xd9    0x16
0x555555557fd8: 0x9f    0xbc    0x97    0xfb    0x85    0xd9    0xa6    0x9e
0x555555557fe0: 0xd4    0xd6    0x02    0x59    0xd5    0x28    0xb3    0x93
0x555555557fe8: 0x16    0xb6    0xc4    0x78    0xc4    0xa2    0x12    0xd2
0x555555557ff0: 0xef    0xb1    0x54    0x18    0xfd    0x76    0x51    0xa3
0x555555557ff8: 0x5e    0x57    0xb8    0x58    0x4b    0x1e    0xe2    0x41
gdb-peda$ x/128bx $rdi
0x7fffffffdde0: 0x63    0xcb    0xd7    0xd4    0xcd    0x26    0x15    0x56
0x7fffffffdde8: 0x96    0x64    0xf4    0x3a    0x46    0xb0    0xeb    0x9e
0x7fffffffddf0: 0x3e    0xb3    0x36    0x21    0xe4    0x08    0x96    0xd1
0x7fffffffddf8: 0xc5    0x43    0x4b    0x8c    0x1a    0x0c    0x78    0xa8
0x7fffffffde00: 0xe8    0xf6    0x37    0x3c    0x0c    0x98    0x9c    0x23
0x7fffffffde08: 0xd1    0xf2    0x50    0x91    0x09    0xa1    0x22    0x59
0x7fffffffde10: 0x66    0x53    0x68    0x36    0xbb    0x53    0x25    0xae
0x7fffffffde18: 0xac    0xee    0x84    0xde    0x82    0xb7    0xda    0x38
0x7fffffffde20: 0xfb    0x0b    0xe5    0xe4    0xb2    0x43    0xc8    0xef
0x7fffffffde28: 0xd4    0x8b    0xdc    0x36    0xbf    0xd0    0x0d    0xf2
0x7fffffffde30: 0x85    0x15    0x11    0xcd    0x7b    0x62    0xb8    0x77
0x7fffffffde38: 0xfe    0xdd    0xf6    0x9a    0xe4    0xb8    0xc7    0xff
0x7fffffffde40: 0xb5    0xb7    0x63    0x38    0xb4    0x49    0xd2    0xf2
0x7fffffffde48: 0x77    0xd7    0xa5    0x19    0xa5    0xc3    0x73    0xb3
0x7fffffffde50: 0x8e    0xd0    0x35    0x79    0x9c    0x17    0x30    0xc2
0x7fffffffde58: 0x3f    0x36    0xd9    0x39    0x2a    0x7f    0x83    0x20

以下で解ける

enc1 = [
    0x63, 0xcb, 0xd7, 0xd4, 0xcd, 0x26, 0x15, 0x56,
    0x96, 0x64, 0xf4, 0x3a, 0x46, 0xb0, 0xeb, 0x9e,
    0x3e, 0xb3, 0x36, 0x21, 0xe4, 0x08, 0x96, 0xd1,
    0xc5, 0x43, 0x4b, 0x8c, 0x1a, 0x0c, 0x78, 0xa8,
    0xe8, 0xf6, 0x37, 0x3c, 0x0c, 0x98, 0x9c, 0x23,
    0xd1, 0xf2, 0x50, 0x91, 0x09, 0xa1, 0x22, 0x59,
    0x66, 0x53, 0x68, 0x36, 0xbb, 0x53, 0x25, 0xae,
    0xac, 0xee, 0x84, 0xde, 0x82, 0xb7, 0xda, 0x38,
    0xfb, 0x0b, 0xe5, 0xe4, 0xb2, 0x43, 0xc8, 0xef,
    0xd4, 0x8b, 0xdc, 0x36, 0xbf, 0xd0, 0x0d, 0xf2,
    0x85, 0x15, 0x11, 0xcd, 0x7b, 0x62, 0xb8, 0x77,
    0xfe, 0xdd, 0xf6, 0x9a, 0xe4, 0xb8, 0xc7, 0xff,
    0xb5, 0xb7, 0x63, 0x38, 0xb4, 0x49, 0xd2, 0xf2,
    0x77, 0xd7, 0xa5, 0x19, 0xa5, 0xc3, 0x73, 0xb3,
    0x8e, 0xd0, 0x35, 0x79, 0x9c, 0x17, 0x30, 0xc2,
    0x3f, 0x36, 0xd9, 0x39, 0x2a, 0x7f, 0x83, 0x20,
]

enc2 = [
    0x78, 0xcf, 0xc4, 0x85, 0xdc, 0x33, 0x07, 0x4c,
    0x93, 0x35, 0xfb, 0x7c, 0x10, 0x8e, 0xbe, 0x93,
    0x28, 0xe6, 0x2e, 0x75, 0xda, 0x5e, 0x85, 0xc5,
    0x91, 0x15, 0x75, 0x89, 0x48, 0x0e, 0x29, 0xa4,
    0xf9, 0xa6, 0x3a, 0x6e, 0x1f, 0x84, 0xf7, 0x42,
    0xb0, 0x93, 0x31, 0xf0, 0x68, 0xc0, 0x43, 0x38,
    0x07, 0x32, 0x09, 0x57, 0xda, 0x32, 0x44, 0xcf,
    0xcd, 0x8f, 0xe5, 0xbf, 0xe3, 0xd6, 0xbb, 0x59,
    0x9a, 0x6a, 0x84, 0x85, 0xd3, 0x22, 0xa9, 0x8e,
    0xb5, 0xea, 0xbd, 0x57, 0xde, 0xb1, 0x6c, 0x93,
    0xe4, 0x74, 0x70, 0xac, 0x1a, 0x03, 0xd9, 0x16,
    0x9f, 0xbc, 0x97, 0xfb, 0x85, 0xd9, 0xa6, 0x9e,
    0xd4, 0xd6, 0x02, 0x59, 0xd5, 0x28, 0xb3, 0x93,
    0x16, 0xb6, 0xc4, 0x78, 0xc4, 0xa2, 0x12, 0xd2,
    0xef, 0xb1, 0x54, 0x18, 0xfd, 0x76, 0x51, 0xa3,
    0x5e, 0x57, 0xb8, 0x58, 0x4b, 0x1e, 0xe2, 0x41,
]

stream = [ord('a') ^ x for x in enc1]
flag = ''.join(chr(stream[i] ^ enc2[i]) for i in range(0x80))
print(flag) # zer0pts{d0n'7_4lw4y5_7ru57_d3c0mp1l3r}

フラグが128文字ないのだが、LF(10)の後からヌルバイト(0)になっている [122, 101, 114, 48, 112, 116, 115, 123, 100, 48, 110, 39, 55, 95, 52, 108, 119, 52, 121, 53, 95, 55, 114, 117, 53, 55, 95, 100, 51, 99, 48, 109, 112, 49, 108, 51, 114, 125, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

roaris commented 1 day ago

r13をgdbで取り出して、RC4_encrypt関数内の処理を再現することで、鍵ストリームを求めることでも解ける

r13 = [
    0x32, 0x3b, 0x67, 0x36, 0xf7, 0x6f, 0x9f, 0x73,
    0xac, 0x12, 0x49, 0x1c, 0x92, 0xb3, 0xbd, 0x44,
    0x2e, 0x25, 0x09, 0xfb, 0x1a, 0x8b, 0x3d, 0x2b,
    0x57, 0x22, 0xfa, 0x0f, 0x7d, 0xae, 0x4e, 0x41,
    0x0c, 0xbc, 0x5f, 0x9b, 0xd8, 0x06, 0x65, 0x9d,
    0xfc, 0xf6, 0xbb, 0x5b, 0x05, 0x13, 0x5c, 0x50,
    0x11, 0xba, 0x9c, 0xb9, 0x93, 0x27, 0xf2, 0xaf,
    0x8a, 0x23, 0x56, 0x46, 0xc5, 0x78, 0x99, 0xe9,
    0x72, 0xb8, 0x45, 0x5d, 0xfe, 0x54, 0xdf, 0x7c,
    0x83, 0x95, 0x61, 0x3c, 0xe0, 0x15, 0x76, 0x7e,
    0xde, 0x74, 0x6d, 0x77, 0xd2, 0x70, 0x58, 0xe3,
    0x28, 0x90, 0xab, 0x8d, 0x3e, 0xa1, 0xd5, 0x19,
    0xaa, 0xfd, 0x20, 0x17, 0x4d, 0x1d, 0x64, 0x9a,
    0x6a, 0xdc, 0x4b, 0x96, 0x3a, 0x04, 0x85, 0x75,
    0x47, 0x30, 0xa4, 0x2d, 0x59, 0xd4, 0xbf, 0x94,
    0xe6, 0xd9, 0x6e, 0x08, 0x1b, 0x33, 0xf0, 0xd7,
    0x88, 0x02, 0xb2, 0x4f, 0xa5, 0x51, 0x4a, 0x39,
    0xc0, 0x2f, 0x68, 0xad, 0xe7, 0x1e, 0xf8, 0x98,
    0xb6, 0xcf, 0xd0, 0x0e, 0x5e, 0xc6, 0x60, 0xcb,
    0xee, 0xc2, 0xdd, 0xc8, 0xa7, 0xc1, 0xcd, 0x34,
    0x3f, 0xd6, 0xf9, 0xea, 0x97, 0xe8, 0x84, 0xeb,
    0x86, 0xc9, 0x8f, 0x7a, 0xec, 0xed, 0x48, 0x2c,
    0x21, 0xce, 0x43, 0x8c, 0x24, 0x6b, 0x66, 0x6c,
    0x82, 0x69, 0x9e, 0x4c, 0x91, 0xcc, 0x81, 0xe2,
    0x2a, 0xc4, 0x1f, 0xe5, 0x63, 0x53, 0xa9, 0x89,
    0x7f, 0xa3, 0xf4, 0xb4, 0x07, 0x00, 0xa8, 0xf3,
    0xd3, 0xbe, 0xdb, 0x14, 0x03, 0x37, 0x38, 0x0d,
    0x5a, 0x79, 0x10, 0x01, 0x87, 0xd1, 0xa6, 0x55,
    0x80, 0x71, 0xca, 0x0b, 0x8e, 0xf1, 0xa0, 0x52,
    0xa2, 0xc3, 0xb5, 0xf5, 0x0a, 0xc7, 0x31, 0x7b,
    0x16, 0x40, 0xe1, 0xff, 0xb1, 0x18, 0xb7, 0xef,
    0x42, 0xe4, 0xb0, 0x35, 0x29, 0xda, 0x26, 0x62,
]

stream = []
edx = 0
ebx = 0

for _ in range(0x80):
    edx += 1
    eax = r13[edx]
    ebx = (ebx + eax) & 0xff
    dil = r13[edx]
    sil = r13[ebx]
    r13[edx] = sil
    r13[ebx] = dil
    eax = r13[edx]
    edi = r13[ebx]
    eax = (eax + edi) & 0xff
    stream.append(r13[eax])

enc = [
    0x78, 0xcf, 0xc4, 0x85, 0xdc, 0x33, 0x07, 0x4c,
    0x93, 0x35, 0xfb, 0x7c, 0x10, 0x8e, 0xbe, 0x93,
    0x28, 0xe6, 0x2e, 0x75, 0xda, 0x5e, 0x85, 0xc5,
    0x91, 0x15, 0x75, 0x89, 0x48, 0x0e, 0x29, 0xa4,
    0xf9, 0xa6, 0x3a, 0x6e, 0x1f, 0x84, 0xf7, 0x42,
    0xb0, 0x93, 0x31, 0xf0, 0x68, 0xc0, 0x43, 0x38,
    0x07, 0x32, 0x09, 0x57, 0xda, 0x32, 0x44, 0xcf,
    0xcd, 0x8f, 0xe5, 0xbf, 0xe3, 0xd6, 0xbb, 0x59,
    0x9a, 0x6a, 0x84, 0x85, 0xd3, 0x22, 0xa9, 0x8e,
    0xb5, 0xea, 0xbd, 0x57, 0xde, 0xb1, 0x6c, 0x93,
    0xe4, 0x74, 0x70, 0xac, 0x1a, 0x03, 0xd9, 0x16,
    0x9f, 0xbc, 0x97, 0xfb, 0x85, 0xd9, 0xa6, 0x9e,
    0xd4, 0xd6, 0x02, 0x59, 0xd5, 0x28, 0xb3, 0x93,
    0x16, 0xb6, 0xc4, 0x78, 0xc4, 0xa2, 0x12, 0xd2,
    0xef, 0xb1, 0x54, 0x18, 0xfd, 0x76, 0x51, 0xa3,
    0x5e, 0x57, 0xb8, 0x58, 0x4b, 0x1e, 0xe2, 0x41,
]

flag = ''

for i in range(0x80):
    flag += chr(enc[i] ^ stream[i])

print(flag)