Skip to content

Instantly share code, notes, and snippets.

@hhc0null
Last active May 26, 2017 16:25
Show Gist options
  • Save hhc0null/942c0c54be0f40cbe41f to your computer and use it in GitHub Desktop.
Save hhc0null/942c0c54be0f40cbe41f to your computer and use it in GitHub Desktop.
[NDH2k15 Crackme_Reverse-Superman-500pts] The superman is a brain fucker.
// get origin address.
// 08077008 E81C060000 call dword 0x8077629
// 0807700D 83EE05 sub esi,byte +0x5 // esi - 5: 0x8077008
origin = (void *)0x8077008;
int sub_08077010()
{
ebp_c04h = sub_080775B2(origin, 0x621);
if(getuid() != 0) {
sub_08077259(origin+0x628, ebp_c04h);
exit(EXIT_FAILURE);
}
sub_08077259(origin+0x9bd, 0x27a, ebp_c04h);
reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART, NULL);
// main routine.
area = mmap(1<<0xc, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANONYMOUS|MAP_PRIVATE, NULL, NULL);
len = read(STDIN_FILENO, area, 0x1000);
area[len-1] = '\0';
sub_0807723C(ebp_c00h, '\0', 0x400);
sub_0807723C(ebp_400h, '\0', 0x400);
// ebp_800h is dest. origin+0x1633 is src.
sub_080775F6(ebp_800h, 0x400, origin+0x1633, 0x3b6, ebp_c04h); // decrypt
// arg0: input buffer, arg1: input buffer size,
// arg2: loop buffer, arg3: loop buffer size,
// arg4: output buffer, arg5: output buffer size
sub_0807730A(ebp_400h, 0x400, ebp_800h, 0x400, ebp_c00h, 0x400); // brainfuck.
sub_080771DB(ebp_c00h, area);
if(sub_0807719E(ebp_c00h, area) != 0) {
sub_08077259(origin+0xc37, 0x552, ebp_c04h);
return 1;
}
sub_08077259(origin+0x1189, 0x4aa, ebp_c04h);
return 0;
}
int sub_0807719E(int arg0, char arg1)
{
int i;
char a, b;
for(i = 0; (a = (arg0[i] != '\0')) && (b = (arg1[i] != '\0')) && !(a-b); i++) {
}
return a - b; // have to be zero.
}
int sub_080771DB(char *arg0, char *arg1)
{
int i;
char a, b;
for(i = 0; (a = (arg0[i] != '\0')) && (b = (arg1[i] != '\0')) && !(a-b); i++) {
}
return a - b; // have to be zero.
}
size_t sub_08077206(int *arg0)
{
int i;
for(i = 0; arg0[i] != '\0'; i++) {
}
return i;
}
size_t sub_08077221(char *arg0)
{
int i;
for(i = 0; arg0[i] != '\0'; i++) {
}
return i;
}
void sub_0807723C(char *arg0, int arg1, int arg2)
{
for(i = 0; i < arg2; i++) {
arg1[i] = arg1;
}
}
void sub_08077259(arg0, arg1, arg2)
{
sub_0807723C(ebp_d00h, '\0', 0x100);
sub_0807723C(ebp_400h, '\0', 0x400);
sub_080775F6(ebp_c00h, 0x800, arg0, arg1, arg2);
sub_0807730A(ebp_400h, 0x400, ebp_c00h, 0x800, ebp_d00h, 0x100);
sub_08077221(ebp_d00h);
write(STDOUT_FILENO, ebp_d00h, sub_08077206(ebp_d00h));
}
// arg0: input buffer, arg1: input buffer size,
// arg2: loop buffer, arg3: loop buffer size,
// arg4: output buffer, arg5: output buffer size
int sub_0807730A(char *arg0, int arg1, char *arg2, int arg3, char *arg4, int arg5)
{
// Local variables.
int ebp_810h; //
int ebp_80ch; // stack pointer.
int ebp_808h; // for loop.
int ebp_804h; // loop []
char *ebp_800h[0x800];
sub_0807723C(ebp_800h, '\0', 0x800);
ebp_804h = 0;
ebp_808h = 0;
ebp_80ch = 0;
ebp_810h = 0;
for(ebp_808h = 0; ebp_808h < ebp_14h; ebp_808h) {
switch(arg2[ebp_808h]) {
case '\0':
return 0;
case '<':
if(ebp_80ch <= 0) ebp_80ch--;
break;
case '>':
if(ebp_80ch <= arg1) ebp_80ch++;
break;
case '-':
if(0 <= ebp_80ch && ebp_80ch <= arg1) arg0[ebp_80ch]--;
break;
case '+':
if(0 <= ebp_80ch && ebp_80ch <= arg1) arg0[ebp_80ch]++;
break;
case '[':
// GEKI-mendokusai dot JP;
break;
case ']':
// GEKI-mendokusai dot JP;
break;
case '.':
if(0 <= ebp_80ch && ebp_80ch <= arg1 && 0 <= ebp_810h && ebp_810h <= arg5){
arg4[arg_810h] = arg0[ebp_80ch];
ebp_810h++;
}
break;
case ',':
write(STDOUT_FILENO, origin+0x19ff, 0x2dd);
deafult:
}
}
return 0;
}
// Manipulation Detaction.
int sub_080775B2(arg0, arg1)
{
// Local variables.
int ebp_08h;
int ebp_04h;
ebp_04h = 0x1505;
for(ebp_08h = 0; ebp_08h < arg1; ebp_08h++) {
ebp_04h = arg0[ebp_08h] + ebp_04h + (ebp_04h << 5);
}
return ebp_04h;
}
int sub_080775F6(arg0, arg1, arg2, arg3, arg4)
{
int i;
int c;
c = arg4;
for(i = 0; i < arg3 && i < arg1; i++, ROT(c)) { // ROT means instruction 'rol'.
arg0[i] = arg2[i] ^ c;
}
return 0;
}
// restore eip to esi.
// 08077629 5E pop esi
// 0807762A E9DEF9FFFF jmp dword 0x807700d
// -------------------------- data ---------------------------------
/*
0807762F 00E7 add bh,ah
08077631 99 cdq
08077632 4F dec edi
08077633 E3BA jecxz 0x80775ef
08077635 086CA434 or [esp+0x34],ch
08077639 6443 fs inc ebx
0807763B D5D7 aad 0xd7
0807763D D3DB rcr ebx,cl
0807763F CAE8AC retf 0xace8
08077642 2435 and al,0x35
08077644 0254AFD8 add dl,[edi+ebp*4-0x28]
08077648 E2B8 loop 0x8077602
0807764A 0C65 or al,0x65
0807764C B610 mov dh,0x10
0807764E 48 dec eax
0807764F D2 db 0xd2
08077650 F299 repne cdq
08077652 4F dec edi
08077653 E3BA jecxz 0x807760f
08077655 086CA444 or [esp+0x44],ch
08077659 0354D5D7 add edx,[ebp+edx*8-0x29]
0807765D D3DB rcr ebx,cl
0807765F CAE8AC retf 0xace8
08077662 2435 and al,0x35
08077664 17 pop ss
08077665 52 push edx
08077666 CC int3
08077667 C9 leave
08077668 94 xchg eax,esp
08077669 AF scasd
0807766A 0C65 or al,0x65
0807766C B610 mov dh,0x10
0807766E 5D pop ebp
0807766F D2E7 shl bh,cl
08077671 99 cdq
08077672 4F dec edi
08077673 E3BA jecxz 0x807762f
08077675 086CA434 or [esp+0x34],ch
08077679 6443 fs inc ebx
0807767B D5D7 aad 0xd7
0807767D D3DB rcr ebx,cl
0807767F CAE8AC retf 0xace8
08077682 2435 and al,0x35
08077684 17 pop ss
08077685 52 push edx
08077686 D9 db 0xd9
08077687 DA db 0xda
08077688 E4CE in al,0xce
0807768A 1B65B6 sbb esp,[ebp-0x4a]
0807768D 105DC7 adc [ebp-0x39],bl
08077690 E78C out 0x8c,eax
08077692 4F dec edi
08077693 E3BA jecxz 0x807764f
08077695 086CA434 or [esp+0x34],ch
08077699 1424 adc al,0x24
0807769B C2D7D3 ret 0xd3d7
0807769E DBCA fcmovne st2
080776A0 E8AC243517 call dword 0x1f3c9b51
080776A5 52 push edx
080776A6 D9CF fxch st7
080776A8 F7BE7A72B610 idiv dword [esi+0x10b6727a]
080776AE 5D pop ebp
080776AF C7 db 0xc7
080776B0 E78C out 0x8c,eax
080776B2 4F dec edi
080776B3 E3BA jecxz 0x807766f
080776B5 081CB3 or [ebx+esi*4],bl
080776B8 3414 xor al,0x14
080776BA 54 push esp
080776BB D5D7 aad 0xd7
080776BD D3DB rcr ebx,cl
080776BF CAFDAA retf 0xaafd
080776C2 52 push edx
080776C3 2017 and [edi],dl
080776C5 52 push edx
080776C6 D9CF fxch st7
080776C8 E2B8 loop 0x8077682
080776CA 0C65 or al,0x65
080776CC C6075D mov byte [edi],0x5d
080776CF C7 db 0xc7
080776D0 F299 repne cdq
080776D2 4F dec edi
080776D3 E3BA jecxz 0x807768f
080776D5 086CA434 or [esp+0x34],ch
080776D9 1454 adc al,0x54
080776DB D5C2 aad 0xc2
080776DD D5AD aad 0xad
080776DF DDE8 fucomp st0
080776E1 AC lodsb
080776E2 2420 and al,0x20
080776E4 0252D9 add dl,[edx-0x27]
080776E7 CF iretd
080776E8 E2B8 loop 0x80776a2
080776EA 0C65 or al,0x65
080776EC B660 mov dh,0x60
080776EE 4A dec edx
080776EF C7 db 0xc7
080776F0 F299 repne cdq
080776F2 4F dec edi
080776F3 E3BA jecxz 0x80776af
080776F5 086CA434 or [esp+0x34],ch
080776F9 1454 adc al,0x54
080776FB D5D7 aad 0xd7
080776FD C6 db 0xc6
080776FE DDBCFFAC243517 fnstsw [edi+edi*8+0x173524ac]
08077705 52 push edx
08077706 CC int3
08077707 DA db 0xda
08077708 E2B8 loop 0x80776c2
0807770A 0C65 or al,0x65
0807770C B610 mov dh,0x10
0807770E 5D pop ebp
0807770F C7828E4FE3BA086C mov dword [edx-0x451cb072],0x34a46c08
-A434
08077719 1454 adc al,0x54
0807771B D5D7 aad 0xd7
0807771D D3DB rcr ebx,cl
0807771F CAFDAA retf 0xaafd
08077722 52 push edx
08077723 2017 and [edi],dl
08077725 52 push edx
08077726 D9CF fxch st7
08077728 E2B8 loop 0x80776e2
0807772A 0C65 or al,0x65
0807772C C6075D mov byte [edi],0x5d
0807772F C7 db 0xc7
08077730 F299 repne cdq
08077732 4F dec edi
08077733 E3BA jecxz 0x80776ef
08077735 086CA434 or [esp+0x34],ch
08077739 1441 adc al,0x41
0807773B D3A1C4DBCAE8 shl dword [ecx-0x1735243c],cl
08077741 AC lodsb
08077742 2420 and al,0x20
08077744 0252D9 add dl,[edx-0x27]
08077747 CF iretd
08077748 E2B8 loop 0x8077702
0807774A 0C65 or al,0x65
0807774C B660 mov dh,0x60
0807774E 4A dec edx
0807774F C7 db 0xc7
08077750 F299 repne cdq
08077752 4F dec edi
08077753 E3BA jecxz 0x807770f
08077755 086CA434 or [esp+0x34],ch
08077759 1454 adc al,0x54
0807775B D5D7 aad 0xd7
0807775D C6 db 0xc6
0807775E DDBCFFAC242002 fnstsw [edi+edi*8+0x22024ac]
08077765 52 push edx
08077766 D9CF fxch st7
08077768 E2B8 loop 0x8077722
0807776A 0C65 or al,0x65
0807776C B660 mov dh,0x60
0807776E 4A dec edx
0807776F C7 db 0xc7
08077770 F299 repne cdq
08077772 4F dec edi
08077773 E3BA jecxz 0x807772f
08077775 086CA434 or [esp+0x34],ch
08077779 1454 adc al,0x54
0807777B C0D1A5 rcl cl,byte 0xa5
0807777E CC int3
0807777F CAE8AC retf 0xace8
08077782 3120 xor [eax],esp
08077784 17 pop ss
08077785 52 push edx
08077786 D9CF fxch st7
08077788 E2B8 loop 0x8077742
0807778A 0C65 or al,0x65
0807778C C6075D mov byte [edi],0x5d
0807778F C7 db 0xc7
08077790 F299 repne cdq
08077792 4F dec edi
08077793 E3BA jecxz 0x807774f
08077795 086CA434 or [esp+0x34],ch
08077799 1454 adc al,0x54
0807779B C0D1A5 rcl cl,byte 0xa5
0807779E CC int3
0807779F CAE8AC retf 0xace8
080777A2 2435 and al,0x35
080777A4 17 pop ss
080777A5 52 push edx
080777A6 CC int3
080777A7 DA db 0xda
080777A8 E2B8 loop 0x8077762
080777AA 0C65 or al,0x65
080777AC B610 mov dh,0x10
080777AE 5D pop ebp
080777AF C7828E4FE3BA086C mov dword [edx-0x451cb072],0x34a46c08
-A434
080777B9 1454 adc al,0x54
080777BB D5D7 aad 0xd7
080777BD D3DB rcr ebx,cl
080777BF CAFDAA retf 0xaafd
080777C2 52 push edx
080777C3 2217 and dl,[edi]
080777C5 52 push edx
080777C6 D9CF fxch st7
080777C8 E2B8 loop 0x8077782
080777CA 0C70 or al,0x70
080777CC A3105DC7F2 mov [0xf2c75d10],eax
080777D1 E958E3BA08 jmp dword 0x10c25b2e
080777D6 6C insb
080777D7 A4 movsb
080777D8 3414 xor al,0x14
080777DA 54 push esp
080777DB C0D1A5 rcl cl,byte 0xa5
080777DE CE into
080777DF CAE8AC retf 0xace8
080777E2 2435 and al,0x35
080777E4 17 pop ss
080777E5 52 push edx
080777E6 D9BFF5B80C65 fnstcw [edi+0x650cb8f5]
080777EC B610 mov dh,0x10
080777EE 5D pop ebp
080777EF C7 db 0xc7
080777F0 F299 repne cdq
080777F2 4F dec edi
080777F3 E3BA jecxz 0x80777af
080777F5 086CB132 or [ecx+esi*4+0x32],ch
080777F9 6241D5D7D3DB vpsrlq xmm11{k7}{z},xmm21,xmm11
080777FF CAE8AC retf 0xace8
08077802 2445 and al,0x45
08077804 0052D9 add [edx-0x27],dl
08077807 CF iretd
08077808 E2B8 loop 0x80777c2
0807780A 0C65 or al,0x65
0807780C B610 mov dh,0x10
0807780E 5D pop ebp
0807780F C7 db 0xc7
08077810 F299 repne cdq
08077812 5A pop edx
08077813 E5CC in eax,0xcc
08077815 1F pop ds
08077816 6C insb
08077817 A4 movsb
08077818 3414 xor al,0x14
0807781A 54 push esp
0807781B D5D7 aad 0xd7
0807781D C6 db 0xc6
0807781E CE into
0807781F CAE8AC retf 0xace8
08077822 2435 and al,0x35
08077824 17 pop ss
08077825 52 push edx
08077826 D9BFF5B80C65 fnstcw [edi+0x650cb8f5]
0807782C B610 mov dh,0x10
0807782E 5D pop ebp
0807782F C7 db 0xc7
08077830 F299 repne cdq
08077832 4F dec edi
08077833 E3BA jecxz 0x80777ef
08077835 086CB132 or [ecx+esi*4+0x32],ch
08077839 62 db 0x62
0807783A 43 inc ebx
0807783B D5D7 aad 0xd7
0807783D D3DB rcr ebx,cl
0807783F CAE8AC retf 0xace8
08077842 3120 xor [eax],esp
08077844 17 pop ss
08077845 52 push edx
08077846 D9CF fxch st7
08077848 E2B8 loop 0x8077802
0807784A 0C65 or al,0x65
0807784C C6075D mov byte [edi],0x5d
0807784F C7 db 0xc7
08077850 F299 repne cdq
08077852 4F dec edi
08077853 E3BA jecxz 0x807780f
08077855 086CA434 or [esp+0x34],ch
08077859 1441 adc al,0x41
0807785B D3A1C4DBCAE8 shl dword [ecx-0x1735243c],cl
08077861 AC lodsb
08077862 2420 and al,0x20
08077864 0252D9 add dl,[edx-0x27]
08077867 CF iretd
08077868 E2B8 loop 0x8077822
0807786A 0C65 or al,0x65
0807786C B660 mov dh,0x60
0807786E 4A dec edx
0807786F C7 db 0xc7
08077870 F299 repne cdq
08077872 4F dec edi
08077873 E3BA jecxz 0x807782f
08077875 086CA434 or [esp+0x34],ch
08077879 1454 adc al,0x54
0807787B D5D7 aad 0xd7
0807787D C6 db 0xc6
0807787E DDBCFFAC242002 fnstsw [edi+edi*8+0x22024ac]
08077885 52 push edx
08077886 D9CF fxch st7
08077888 E2C8 loop 0x8077852
0807788A 1B65B6 sbb esp,[ebp-0x4a]
0807788D 105DC7 adc [ebp-0x39],bl
08077890 F299 repne cdq
08077892 4F dec edi
08077893 F6BC7E7BA42101 idiv byte [esi+edi*2+0x121a47b]
0807789A 54 push esp
0807789B D5D7 aad 0xd7
0807789D D3ABDDE8AC24 shr dword [ebx+0x24ace8dd],cl
080778A3 351752D9CF xor eax,0xcfd95217
080778A8 F7BE7A72B605

NDH2k15 Crackme/Reverse-Superman-500pts

概要

 x86で動くELFバイナリ. 特筆すべき点を以下に挙げる.

  • セクションヘッダが存在しないのにe_shoffが指定(デバッガでアタッチ不可)
  • 改竄検知(パッチされていないかどうかを検知)の実装
  • エンコード処理されたバイナリが載せられていてヒープ領域に実行可能領域をつくりそこに展開(アンパック)
  • アンパック後にgetuidして0(=root)だったらreboot
  • アンパック後にmmap()でrwx領域を作りつつ, read()で読み込み
  • アンパック後に上の処理を抜けたらbrainfuckの処理系
  • アンパック後に表示されるテキストもすべて暗号化されている.

 同大会のCrackme/Reverse 150ptsのClark Kentの上位互換な問題. Clark Kentはデバッガ検知と改竄検知だけだった. たぶん.
 superman_barinfuck.csuperman_brainfuck.disasを読みながら進めてね.

アプローチ

セクションヘッダの偽装

 e_shoffに関しては\x7bを\x00にすればデバッガでアタッチできるので解決.

対改竄検知

 改竄検知については, 指定された範囲1バイトでも改竄されていると引っかかるので, デバッガでブレークかけるとint3(cc)がバイナリ内に落ちるのでダメ. これに関してはハードウェアブレークポイントを利用すれば解決する.

アンパック後のreboot処理

 getuid()したあとのtest命令の部分で

set $pc = 0x08077098

とすると, reboot後の処理に飛べる.

アンパック後のbrainfuckの処理系

 これに関してはバイナリちょっと読んだけどノータッチ. 面倒くさいんだもん.

解法

 セクションヘッダを変えてデバッガでアタッチできるようにする.  アンパック前はあまり読んでいないが念のため, ハードウェアブレークポイントを使ってアンパック後のルーチンまで飛ぶ.  アンパック後の処理は改竄検知が効いているのでハードウェアブレークポイントでgetuid()の後で動作止めてreboot処理後に飛ぶ.
 read()でなにか入力することになるけど適当に入力し, 同様にbrainfuckのバッファを用意している処理もスルー.
 0x08077156のところでアンパックされたバイナリのデータ部分とread()されたものを比較するが, 比較対象が復号化後のものとなっているのでフラグが見える.

Have a good hack time<3<3<3

OMGTh4tW4s4H0rr1bl3Ch4ll3ng3!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment