Open roaris opened 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...
main関数
RC4_setkeyとRC4_encryptが気になる RC4はストリーム暗号の一種で、鍵ストリーム(疑似乱数列)と平文のxorで暗号化する https://zenn.dev/mahiro33/articles/6f74d1dc8532b4
read関数の引数にrspが渡されていることから、入力文字列はrspに格納されることが分かる
RC4_encrypt関数の引数には、rsp(入力文字列)とrsp+0x80が渡される rsp+0x80に暗号化結果が格納されると推測出来る
memcmp関数で、rsp+0x80に格納されたバイト列と特定のバイト列との比較をしている 一致していればCorrect!と表示され、一致していなければWrong...と表示される
RC4_encrypt関数 r13, r14, r15とか出てくる一方で、引数のrsi, rdiが使われていない しかし、main関数の上の方を見ると、r15がrsp, r14がrsp+0x80となっていることが分かる
ecxがループ変数になっていて、0x80回ループが回っている
xor al, [r15+rcx]; mov [r14+rcx], al;
が重要な部分で、鍵ストリームと平文のxorを表している
鍵ストリームはr13を元に作っている RC4_setkey関数を見ると、r13に対して何かしら処理している この問題を解くうえでは、ここの処理を理解する必要はない
楽な解法は、aaa...aaa(0x80文字)を入力として与えて、RC4_encrypt関数の暗号化結果とaaa...aaaのxorから鍵ストリームを求めて、比較対象のバイト列と鍵ストリームのxorから平文を求めるというものである
罠があって、memcmp関数には引数が2つ渡されているが(rsiとrdiで、rdiはRC4_encrypt関数の暗号化結果)、rsiの方はmemcmp関数内で上書きされている
以下のように、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]
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)
https://alpacahack.com/challenges/decompile-me