インタビュープログラムをハッキングするように頼まれました

TL; DRインタビュープログラムにハッキングするように頼まれました。 そして、私は仕事を得ました。



みなさん、こんにちは



私はソフトウェアセキュリティエンジニアの立場についてインタビューしましたが、彼らはほとんど異なる低レベルのものを尋ねました。 いくつかの答えを知っていましたが、しませんでした。

その後、ハッキングが必要な安全で暗号化されたバイナリを含むメールを送信しました。

家に着いたとき、私はそれをダウンロードして、パスワードを要求しているのを見ました。 彼らは私にこのパスワードを見つけてほしかった。

これは私が最初に始めたときに見たものです:



ルート@ lisa:〜#./CrackTheDoor



***ドア制御システム***



パスワード:


愚かな言葉を3回入力すると、プログラムは終了しました。

分析用のツールはまだ在庫があります。 ファイルに関する詳細情報を取得しましょう。



ルート@ lisa:〜#ファイルCrackTheDoor

CrackTheDoor:ELF 32ビットLSB実行可能ファイル、Intel 80386、バージョン1(SYSV)、動的リンク(共有ライブラリを使用)、GNU / Linux 2.6.15用、BuildID [sha1] = 0x9927be2fe310bea01d412164103b9c8b2d7567ea、削除なし

ルート@ lisa:〜#


さて、これでバイナリについてもう少し理解できました。



ルート@ lisa:〜#ldd CrackTheDoor

linux-gate.so.1 =>(0xf777b000)

libc.so.6 => /lib32/libc.so.6(0xf760c000)

/lib/ld-linux.so.2(0xf777c000)

ルート@ lisa:〜#


異常なことは何もありません。 少し説明します。 linux-gate.soがファイルシステムにない場合があります。 しかし、lddは共有ライブラリとして表示します。 これは仮想DSOです。



あなたはlinux-gate.so.1について知っています。

libc.so.6がGNUシステムのメインCライブラリであることも知っているかもしれません。

ld-linux.soは、Linuxの動的ライブラリローダーです。



デバッガでプログラムを実行し、何が起こるかを確認します。



ルート@ lisa:〜#gdb CrackTheDoor

GNU gdb(GDB)7.4.1-debian

著作権©2012 Free Software Foundation、Inc.

ライセンスGPLv3 +:GNU GPLバージョン3以降< gnu.org/licenses/gpl.html >

これはフリーソフトウェアです。自由に変更して再配布できます。

法律で許可されている範囲での保証はありません。 「show copy」と入力します

詳細については「保証を表示」。

このGDBは「x86_64-linux-gnu」として設定されました。

バグ報告の手順については、以下をご覧ください。

< www.gnu.org/software/gdb/bugs > ...

/ root / CrackTheDoorからシンボルを読み取り中...(デバッグシンボルが見つかりません)...完了。

(gdb)r

起動プログラム:/ root / CrackTheDoor



プログラムは信号SIGSEGV、セグメンテーション障害を受信しました。

__do_global_dtors_aux()の0x080484fb

(gdb)


プログラムがクラッシュしました。 これは、ある種のアンチデバッグトリックが必要であることを意味します。 わかった...



もう一度実行して、プログラムのエントリポイントを確認します。



ルート@ lisa:〜#gdb CrackTheDoor

GNU gdb(GDB)7.4.1-debian

著作権©2012 Free Software Foundation、Inc.

ライセンスGPLv3 +:GNU GPLバージョン3以降< gnu.org/licenses/gpl.html >

これはフリーソフトウェアです。自由に変更して再配布できます。

法律で許可されている範囲での保証はありません。 「show copy」と入力します

詳細については「保証を表示」。

このGDBは「x86_64-linux-gnu」として設定されました。

バグ報告の手順については、以下をご覧ください。

< www.gnu.org/software/gdb/bugs > ...

/ root / CrackTheDoorからシンボルを読み取り中...(デバッグシンボルが見つかりません)...完了。

(gdb)情報ファイル

「/ root / CrackTheDoor」からのシンボル。

ローカル実行ファイル:

`/ root / CrackTheDoor '、ファイルタイプelf32-i386。

エントリポイント:0x804762c

...

...


エントリポイントにブレークポイントを置き、デバッグを開始します。



b * 0x804762c




次に、「r」を押して開始します。 プログラムエントリポイントの最初の行になります。



gdb)x / 30i $ pc

=> 0x804762c:pusha

0x804762d:mov $ 0xaa、%dl

0x804762f:mov $ 0x8048480、%edi

0x8047634:mov $ 0x8048cbc、%ecx

0x8047639:mov%edi、0x80476f3

0x804763f:mov%ecx、0x80476f7

0x8047645:sub%edi、%ecx

0x8047647:mov $ 0x804762f、%esi

0x804764c:プッシュ$ 0x80476c1

0x8047651:プッシャ

0x8047652:mov $ 0x55、%al

0x8047654:xor $ 0x99、%al

0x8047656:mov $ 0x8047656、%edi

0x804765b:mov $ 0x80476e5、%ecx

0x8047660:サブ$ 0x8047656、%ecx

0x8047666:repnz scas%es:(%edi)、%al

0x8047668:je 0x804770a

0x804766e:mov%edi、0x80476eb

0x8047674:ポパ

0x8047675:0x80476eb、%edxを追加

0x804767b:ret


次のようになります。 AT&TとIntelバージョンの間で構文を選択できます。 インテルが好きです。



アドレス0x8047654で、0x55 alをレジスタに割り当て、それを0x99とXORして0xCCを取得します。

0xCCはプロセスを停止することを意味するため、非常に重要です。 デバッガーがプログラムの実行を中断する場合、停止したい場所でバイトを0xCCに置き換えます。

0x8047666では、repnz scasが表示されます。 これは、al(0xCC)の値のesおよびediに限定されたメモリを探すことを意味します。

したがって、これらの行はメモリをスキャンするだけであり、0xCCがある場合、プログラムは実行を停止します。

ここではあまり時間を使いたくありません。 straceを実行します。



ルート@ lisa:〜#strace ./CrackTheDoor

execve( "./ CrackTheDoor"、["./CrackTheDoor"]、[/ * 17 vars * /])= 0

[プロセスPID = 31085は32ビットモードで実行されます。 ]

brk(0)= 0x9972000

アクセス( "/ etc / ld.so.nohwcap"、F_OK)= -1 ENOENT(そのようなファイルまたはディレクトリはありません)

mmap2(NULL、4096、PROT_READ | PROT_WRITE、MAP_PRIVATE | MAP_ANONYMOUS、-1、0)= 0xfffffffff7715000

アクセス( "/ etc / ld.so.preload"、R_OK)= -1 ENOENT(そのようなファイルまたはディレクトリはありません)

open( "/ etc / ld.so.cache"、O_RDONLY)= 3

fstat64(3、{st_mode = S_IFREG | 0644、st_size = 35597、...})= 0

mmap2(NULL、35597、PROT_READ、MAP_PRIVATE、3、0)= 0xfffffffff770c000

閉じる(3)= 0

アクセス( "/ etc / ld.so.nohwcap"、F_OK)= -1 ENOENT(そのようなファイルまたはディレクトリはありません)

open( "/ lib32 / libc.so.6"、O_RDONLY)= 3

read(3、 "\ 177ELF \ 1 \ 1 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 3 \ 0 \ 3 \ 0 \ 1 \ 0 \ 0 \ 0 \ 300o \ 1 \ 0004 \ 0 \ 0 \ 0 "...、512)= 512

fstat64(3、{st_mode = S_IFREG | 0755、st_size = 1441884、...})= 0

mmap2(NULL、4096、PROT_READ | PROT_WRITE、MAP_PRIVATE | MAP_ANONYMOUS、-1、0)= 0xfffffffff770b000

mmap2(NULL、1456504、PROT_READ | PROT_EXEC、MAP_PRIVATE | MAP_DENYWRITE、3、0)= 0xfffffffff75a7000

mprotect(0xf7704000、4096、PROT_NONE)= 0

mmap2(0xf7705000、12288、PROT_READ | PROT_WRITE、MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE、3、0x15d)= 0xfffffffff7705000

mmap2(0xf7708000、10616、PROT_READ | PROT_WRITE、MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS、-1、0)= 0xfffffffff7708000

閉じる(3)= 0

mmap2(NULL、4096、PROT_READ | PROT_WRITE、MAP_PRIVATE | MAP_ANONYMOUS、-1、0)= 0xfffffffff75a6000

set_thread_area(0xffe4d864)= 0

mprotect(0xf7705000、8192、PROT_READ)= 0

mprotect(0x8049000、4096、PROT_READ)= 0

mprotect(0xf7733000、4096、PROT_READ)= 0

munmap(0xf770c000、35597)= 0

ptrace(PTRACE_TRACEME、0、0x1、0)= -1 EPERM(操作は許可されていません)

ptrace(PTRACE_TRACEME、0、0x1、0)= -1 EPERM(操作は許可されていません)


最後の2行から判断すると、プログラムは再びクラッシュしました。 ptraceシステムコールのため。



Ptraceは、Process Traceの略です。 ptraceを使用すると、デバッガーが行うように、状態を変更することで別のプロセスを制御できます。



デバッガーはptraceを非常に頻繁に使用します。 これが彼らの仕事です。



このセクションのコードは次のようになります。



  int main()
 {
     if(ptrace(PTRACE_TRACEME、0、1、0)<0){
         printf( "DEBUGGING ... Bye \ n");
         1を返します。
     }
     printf( "Hello \ n");
     0を返します。
 } 


ところで、ptrace [PTRACE_TRACEMe]は1回しか実行できません。そのため、デバッガーがその前にプログラムでptraceを呼び出した場合、呼び出しはfalseを返し、誰かがプログラムを外部から制御していることがわかります。

プログラムがデバッグしようとしていると思わないように、ptraceの保護をバイパスする必要があります。

システムコールの結果を置き換えます。

プログラムがptraceを呼び出してゼロを返すタイミングを決定します。

ホームフォルダーに、新しい.gdbinitファイルを作成しました。 したがって、gdbを実行するたびに、構成が自動的に読み込まれます。



〜/ .gdbinit

set disassembly-flavor intel#Intel構文の方が優れています

disassemble-next-lineをオンに設定します

catch syscall ptrace #syscallをキャッチします。

コマンド1

セット($ eax)= 0

続ける

終わり


eaxでは、システムコールの結果になります。 そして、それは常に0であり、これは私たちの場合の真実を意味します。



この方法でデバッグ保護をバイパスし、gdbに戻ることができます。

eren @ lisa:〜$ gdb ./CrackTheDoor

GNU gdb(GDB)7.4.1-debian

著作権©2012 Free Software Foundation、Inc.

ライセンスGPLv3 +:GNU GPLバージョン3以降< gnu.org/licenses/gpl.html >

これはフリーソフトウェアです。自由に変更して再配布できます。

法律で許可されている範囲での保証はありません。 「show copy」と入力します

詳細については「保証を表示」。

このGDBは「x86_64-linux-gnu」として設定されました。

バグ報告の手順については、以下をご覧ください。

< www.gnu.org/software/gdb/bugs > ...

キャッチポイント1(syscall 'ptrace' [26])

/ home / eren / CrackTheDoorからシンボルを読み取り中...(デバッグシンボルが見つかりません)...完了。

(gdb)r

開始プログラム:/ home / eren / CrackTheDoor



キャッチポイント1(syscall ptraceへの呼び出し)、??の0x08047698 ()

=> 0x08047698:3d 00 f0 ff ff cmp eax、0xfffff000



キャッチポイント1(syscall ptraceから返される)、??の0x08047698 ()

=> 0x08047698:3d 00 f0 ff ff cmp eax、0xfffff000



***ドア制御システム***



パスワード:


PJeGPC4TIVaKFmmy53DJにブレークポイントを設定しました



 <code>ブレークポイント2、PJeGPC4TIVaKFmmy53DJの0x08048534()
 => 0x08048534 <PJeGPC4TIVaKFmmy53DJ + 0>:1eプッシュds
 (gdb)x / 40i $ pc
 => 0x8048534 <PJeGPC4TIVaKFmmy53DJ>:プッシュds
    0x8048535 <PJeGPC4TIVaKFmmy53DJ + 1>:mov ebp、esp
    0x8048537 <PJeGPC4TIVaKFmmy53DJ + 3>:サブESP、0x20
    0x804853a <PJeGPC4TIVaKFmmy53DJ + 6>:mov BYTE PTR [ebp-0x1]、0xe4
    0x804853e <PJeGPC4TIVaKFmmy53DJ + 10>:mov BYTE PTR [ebp-0x2]、0x87
    0x8048542 <PJeGPC4TIVaKFmmy53DJ + 14>:mov BYTE PTR [ebp-0x3]、0xfb
    0x8048546 <PJeGPC4TIVaKFmmy53DJ + 18>:mov BYTE PTR [ebp-0x4]、0xbe
    0x804854a <PJeGPC4TIVaKFmmy53DJ + 22>:mov BYTE PTR [ebp-0x5]、0xc9
    0x804854e <PJeGPC4TIVaKFmmy53DJ + 26>:mov BYTE PTR [ebp-0x6]、0x9​​3
    0x8048552 <PJeGPC4TIVaKFmmy53DJ + 30>:mov BYTE PTR [ebp-0x7]、0x84
    0x8048556 <PJeGPC4TIVaKFmmy53DJ + 34>:mov BYTE PTR [ebp-0x8]、0xfc
    0x804855a <PJeGPC4TIVaKFmmy53DJ + 38>:mov BYTE PTR [ebp-0x9]、0x8d
    0x804855e <PJeGPC4TIVaKFmmy53DJ + 42>:mov BYTE PTR [ebp-0xa]、0xe5
    0x8048562 <PJeGPC4TIVaKFmmy53DJ + 46>:mov BYTE PTR [ebp-0xb]、0xbf
    0x8048566 <PJeGPC4TIVaKFmmy53DJ + 50>:mov BYTE PTR [ebp-0xc]、0x5c
    0x804856a <PJeGPC4TIVaKFmmy53DJ + 54>:mov BYTE PTR [ebp-0xd]、0xe2
    0x804856e <PJeGPC4TIVaKFmmy53DJ + 58>:mov BYTE PTR [ebp-0xe]、0x76
    0x8048572 <PJeGPC4TIVaKFmmy53DJ + 62>:mov BYTE PTR [ebp-0xf]、0x21
    0x8048576 <PJeGPC4TIVaKFmmy53DJ + 66>:mov BYTE PTR [ebp-0x10]、0xb8
    0x804857a <PJeGPC4TIVaKFmmy53DJ + 70>:mov DWORD PTR [ebp-0x14]、0x0
    0x8048581 <PJeGPC4TIVaKFmmy53DJ + 77>:mov eax、DWORD PTR [ebp-0x14]
    0x8048584 <PJeGPC4TIVaKFmmy53DJ + 80>:eaxを追加、DWORD PTR [ebp + 0x8]
    0x8048587 <PJeGPC4TIVaKFmmy53DJ + 83>:movzx eax、BYTE PTR [eax]
    0x804858a <PJeGPC4TIVaKFmmy53DJ + 86>:テストal、al
    0x804858c <PJeGPC4TIVaKFmmy53DJ + 88>:je 0x8048808 <PJeGPC4TIVaKFmmy53DJ + 724>
    0x8048592 <PJeGPC4TIVaKFmmy53DJ + 94>:mov eax、DWORD PTR [ebp-0x14]
    0x8048595 <PJeGPC4TIVaKFmmy53DJ + 97>:eaxを追加、DWORD PTR [ebp + 0x8]
    0x8048598 <PJeGPC4TIVaKFmmy53DJ + 100>:mov edx、DWORD PTR [ebp-0x14]
    0x804859b <PJeGPC4TIVaKFmmy53DJ + 103>:edx、DWORD PTR [ebp + 0x8]を追加
    0x804859e <PJeGPC4TIVaKFmmy53DJ + 106>:movzx edx、BYTE PTR [edx]
    0x80485a1 <PJeGPC4TIVaKFmmy53DJ + 109>:xor dl、BYTE PTR [ebp-0x1]
    0x80485a4 <PJeGPC4TIVaKFmmy53DJ + 112>:mov BYTE PTR [eax]、dl
    0x80485a6 <PJeGPC4TIVaKFmmy53DJ + 114>:DWORD PTR [ebp-0x14]、0x1を追加
    0x80485aa <PJeGPC4TIVaKFmmy53DJ + 118>:mov eax、DWORD PTR [ebp-0x14]
    0x80485ad <PJeGPC4TIVaKFmmy53DJ + 121>:eaxを追加、DWORD PTR [ebp + 0x8]
    0x80485b0 <PJeGPC4TIVaKFmmy53DJ + 124>:movzx eax、BYTE PTR [eax]
    0x80485b3 <PJeGPC4TIVaKFmmy53DJ + 127>:テストal、al
    0x80485b5 <PJeGPC4TIVaKFmmy53DJ + 129>:je 0x804880b <PJeGPC4TIVaKFmmy53DJ + 727>
    0x80485bb <PJeGPC4TIVaKFmmy53DJ + 135>:mov eax、DWORD PTR [ebp-0x14]
    0x80485be <PJeGPC4TIVaKFmmy53DJ + 138>:eaxを追加、DWORD PTR [ebp + 0x8]
    0x80485c1 <PJeGPC4TIVaKFmmy53DJ + 141>:mov edx、DWORD PTR [ebp-0x14]
    0x80485c4 <PJeGPC4TIVaKFmmy53DJ + 144>:edx、DWORD PTR [ebp + 0x8]を追加
    0x80485c7 <PJeGPC4TIVaKFmmy53DJ + 147>:movzx edx、BYTE PTR [edx]
    0x80485ca <PJeGPC4TIVaKFmmy53DJ + 150>:xor dl、BYTE PTR [ebp-0x2] </ code>


この部分は興味深いです。 定数の操作と、XOR定数が入力データに適用されるという事実がわかります。 続けましょう...



 (gdb)x / 30i X1bdrhN8Yk9NZ59Vb7P2
    0x8048838 <X1bdrhN8Yk9NZ59Vb7P2>:sbb ecx、DWORD PTR [ecx + 0x20ec83e5]
    0x804883e <X1bdrhN8Yk9NZ59Vb7P2 + 6>:mov DWORD PTR [ebp-0x18]、0x0
    0x8048845 <X1bdrhN8Yk9NZ59Vb7P2 + 13>:mov BYTE PTR [ebp-0x1]、0xd9
    0x8048849 <X1bdrhN8Yk9NZ59Vb7P2 + 17>:mov BYTE PTR [ebp-0x2]、0xcd
    0x804884d <X1bdrhN8Yk9NZ59Vb7P2 + 21>:mov BYTE PTR [ebp-0x3]、0xc9
    0x8048851 <X1bdrhN8Yk9NZ59Vb7P2 + 25>:mov BYTE PTR [ebp-0x4]、0xe5
    0x8048855 <X1bdrhN8Yk9NZ59Vb7P2 + 29>:mov BYTE PTR [ebp-0x5]、0x9​​e
    0x8048859 <X1bdrhN8Yk9NZ59Vb7P2 + 33>:mov BYTE PTR [ebp-0x6]、0xd0
    0x804885d <X1bdrhN8Yk9NZ59Vb7P2 + 37>:mov BYTE PTR [ebp-0x7]、0xe8
    0x8048861 <X1bdrhN8Yk9NZ59Vb7P2 + 41>:mov BYTE PTR [ebp-0x8]、0xa5
    0x8048865 <X1bdrhN8Yk9NZ59Vb7P2 + 45>:mov BYTE PTR [ebp-0x9]、0xaf
    0x8048869 <X1bdrhN8Yk9NZ59Vb7P2 + 49>:mov BYTE PTR [ebp-0xa]、0x87
    0x804886d <X1bdrhN8Yk9NZ59Vb7P2 + 53>:mov BYTE PTR [ebp-0xb]、0xd2
    0x8048871 <X1bdrhN8Yk9NZ59Vb7P2 + 57>:mov BYTE PTR [ebp-0xc]、0x79
    0x8048875 <X1bdrhN8Yk9NZ59Vb7P2 + 61>:mov BYTE PTR [ebp-0xd]、0xa9
    0x8048879 <X1bdrhN8Yk9NZ59Vb7P2 + 65>:mov BYTE PTR [ebp-0xe]、0x5d
    0x804887d <X1bdrhN8Yk9NZ59Vb7P2 + 69>:mov BYTE PTR [ebp-0xf]、0x7
    0x8048881 <X1bdrhN8Yk9NZ59Vb7P2 + 73>:mov BYTE PTR [ebp-0x10]、0x81
    0x8048885 <X1bdrhN8Yk9NZ59Vb7P2 + 77>:mov DWORD PTR [ebp-0x14]、0x0
    0x804888c <X1bdrhN8Yk9NZ59Vb7P2 + 84>:mov eax、DWORD PTR [ebp-0x14]
    0x804888f <X1bdrhN8Yk9NZ59Vb7P2 + 87>:eaxを追加、DWORD PTR [ebp + 0x8]
    0x8048892 <X1bdrhN8Yk9NZ59Vb7P2 + 90>:movzx eax、BYTE PTR [eax]
    0x8048895 <X1bdrhN8Yk9NZ59Vb7P2 + 93>:cmp al、BYTE PTR [ebp-0x1]
    0x8048898 <X1bdrhN8Yk9NZ59Vb7P2 + 96>:je 0x80488a2 <X1bdrhN8Yk9NZ59Vb7P2 + 106>
    0x804889a <X1bdrhN8Yk9NZ59Vb7P2 + 98>:mov eax、DWORD PTR [ebp-0x18]


その他の定数...



そして、残りの機能:



 0x804889d <X1bdrhN8Yk9NZ59Vb7P2 + 101>:JMP 0x8048a20 <X1bdrhN8Yk9NZ59Vb7P2 + 488> 0x80488a2 <X1bdrhN8Yk9NZ59Vb7P2 + 106>:DWORD PTRを追加[EBP-0x14の]、0x1の0x80488a6 <X1bdrhN8Yk9NZ59Vb7P2 + 110>:MOV EAX、DWORD PTR [EBP-0x14の] 0x80488a9 < X1bdrhN8Yk9NZ59Vb7P2 + 113>:追加EAX、DWORD PTR [EBP + 0x8という] 0x80488ac <X1bdrhN8Yk9NZ59Vb7P2 + 116>:movzx EAX、BYTE PTR [EAX] 0x80488af <X1bdrhN8Yk9NZ59Vb7P2 + 119>:CMPら、BYTE PTR [EBP-を0x2] 0x80488b2 <X1bdrhN8Yk9NZ59Vb7P2 122>:JE 0x80488bc <X1bdrhN8Yk9NZ59Vb7P2 + 132> 0x80488b4 <X1bdrhN8Yk9NZ59Vb7P2 + 124>:MOV EAX、DWORD PTR [EBP-0x18の] 0x80488b7 <X1bdrhN8Yk9NZ59Vb7P2 + 127>:JMP 0x8048a20 <X1bdrhN8Yk9NZ59Vb7P2 + 488> 0x80488bc <X1bdrhN8Yk9NZ59Vb7P2 + 132>:アドオンDWORD PTR [ebp-0x14]、0x1 0x80488c0 <X1bdrhN8Yk9NZ59Vb7P2 + 136>:mov eax、DWORD PTR [ebp-0x14] 0x80488c3 <X1bdrhN8Yk9N8_8x8_8b8d8_p_p_p_p8_p8_p8_p_p_p_p8_p8_p8_p8_p8_p8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_p8_p_dp_dp movzx eax、BYTE PTR [eax] 0x80488c9 <X1bdrhN8Yk9NZ59Vb7P2 + 145>:cmp al、BYTE PTR [ebp-0x3] 0x80488cc <X1bdrhN8Yk9NZ59Vb7P2 + 148>:je 0x  80488d6 <X1bdrhN8Yk9NZ59Vb7P2 + 158> 0x80488ce <X1bdrhN8Yk9NZ59Vb7P2 + 150>:MOV EAX、DWORD PTR [EBP-0x18の] 0x80488d1 <X1bdrhN8Yk9NZ59Vb7P2 + 153>:JMP 0x8048a20 <X1bdrhN8Yk9NZ59Vb7P2 + 488> 0x80488d6 <X1bdrhN8Yk9NZ59Vb7P2 + 158>:DWORD PTRを追加[ebp- 0x14]、0x1 0x80488da <X1bdrhN8Yk9NZ59Vb7P2 + 162>:mov eax、DWORD PTR [ebp-0x14] 0x80488dd <X1bdrhN8Yk9NZ59Vb7P2 + 165>:eaxを追加、DWORD PTR 0t <qt} <return> to quit --- 0x80488e0 <X1bdrhN8Yk9NZ59Vb7P2 + 168>:movzx eax、BYTE PTR [eax] 0x80488e3 <X1bdrhN8Yk9NZ59Vb7P2 + 171aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa X1bdrhN8Yk9NZ59Vb7P2 + 184> 0x80488e8 <X1bdrhN8Yk9NZ59Vb7P2 + 176>:MOV EAX、DWORD PTR [EBP-0x18の] 0x80488eb <X1bdrhN8Yk9NZ59Vb7P2 + 179>:JMP 0x8048a20 <X1bdrhN8Yk9NZ59Vb7P2 + 488> 0x80488f0 <X1bdrhN8Yk9NZ59Vb7P2 + 184>:追加DWORD PTR [EBP-0x14の] 、0x1 0x80488f4 <X1bdrhN8Yk9NZ59Vb7P2 + 188>:mov eax、DWORD PTR [ebp-0x14] 0x80488f7 <X1bdrhN8Yk9NZ59Vb7P2 + 191>:eaxを追加、DWORD PTR [eb 0-8 + 80x848 080  bdrhN8Yk9NZ59Vb7P2 + 194>:movzx EAX、BYTE PTR [EAX] 0x80488fd <X1bdrhN8Yk9NZ59Vb7P2 + 197>:CMPら、BYTE PTR [EBP-0x5] 0x8048900 <X1bdrhN8Yk9NZ59Vb7P2 + 200>:JE 0x804890a <X1bdrhN8Yk9NZ59Vb7P2 + 210> 0x8048902 <X1bdrhN8Yk9NZ59Vb7P2 + 202> :のMOV EAX、DWORD PTR [EBP-0x18の] 0x8048905 <X1bdrhN8Yk9NZ59Vb7P2 + 205>:JMP 0x8048a20 <X1bdrhN8Yk9NZ59Vb7P2 + 488> 0x804890a <X1bdrhN8Yk9NZ59Vb7P2 + 210>:DWORD PTR [EBP-0x14の]を追加し、0x1の0x804890e <X1bdrhN8Yk9NZ59Vb7P2 + 214>:MOV eax、DWORD PTR [ebp-0x14] 


私と同じパターンが見られますか? そうでない場合、それは問題ではありません。

このプログラムでは、定数を使用した入力poksornyがチェックされます。

次に、入力をもう一度見てみましょう。最初のバイトはいくつかの定数と一致しません。次に、出力が他のコスタントと比較されます。

最後の2つの関数は次のようになります。



 void PJeGPC4TIVaKFmmy53DJ(int * p)
 {
   int array [] = {0xe4,0x87,0xfb、0xbe、0xc9,0x93,0x84,0xfc、0x8d、0xe5,0xbf、0x5c、0xe2,0x76,0x21,0xb8}
   for(i = 0; i <16; i ++)
  {
     p [i] = p [i] ^配列[i]
  }
 }
 int X1bdrhN8Yk9NZ59Vb7P2(int * p)
 {
    int array = {0xd9,0xcd、0xc9,0xe5,0x9e、0xd0,0xe8,0xa5,0xaf、0x87,0xd2,0x79,0xa9,0x5d、0x7,0x81}
    for(i = 0; i <16; i ++)
  {
     if(p [i]!=配列[i])
          falseを返します。  //失敗します。
  }
  真を返す 
 }


これらの定数にXORを適用するPythonスクリプトをスケッチし、キーを見つけました。



 #!/ usr / bin / python
 firstConst = [0xe4,0x87,0xfb、0xbe、0xc9,0x93,0x84,0xfc、0x8d、0xe5,0xbf、0x5c、0xe2,0x76,0x21,0xb8]
 secondConst = [0xd9,0xcd、0xc9,0xe5,0x9e、0xd0,0xe8,0xa5,0xaf、0x87,0xd2,0x79,0xa9,0x5d、0x7,0x81]
 ret = ""
範囲(16)のxの場合:
         ret + = chr(firstConst [x] ^ secondConst [x])
プリントret


eren @ lisa:〜$ ./CrackTheDoor



***ドア制御システム***



パスワード:= J2 [WClY "bm%K +&9



***アクセス許可***



***ドアが開いた***



ほら!



会社は私に第二部を送ったので、すぐに別の記事を書きます。



All Articles