配列をオーバーフローさせたいのでbuffer[100]
、FreeBSDのbashシェルでPythonスクリプトを渡します。そのバッファをオーバーフローさbuffer[100]
せ、プログラムにホスト名をに出力させるために、文字列として渡すマシンコードが必要stdout
です。
これが私が試したCのコードで、コンソールにホスト名を付けています。:
#include <stdio.h>
int main()
{
char buff[256];
gethostname(buff, sizeof(buff));
printf(""%s", buff);
return 0;
}
これがgccを使用して取得したアセンブリのコードですが、cプログラムのテキストセクションのマシンコードを探すと100バイトより長く、上記のcプログラムのマシンコードが必要なため、必要以上に長くなっています。それは100バイト未満です。
.type main, @function
main:
pushl %ebp; saving the base pointer
movl %esp, %ebp; Taking a snapshot of the stack pointer
subl $264, %esp;
addl $-8, %esp
pushl $256
leal -256(%ebp), %eax
pushl %eax
call gethostname
addl $16, %esp
addl $-8, %esp
leal -256(%ebp), %eax
pushl %eax
pushl $.LCO
call printf
addl $16, %esp
xorl %eax, %eax
jmp .L6
.p2align 2, 0x90
.L6:
leave
ret
.Lfe1:
.size main, .Lfe1-main
.ident "GCC: (GNU) c 2.95.4 20020320 [FreeBSD]"
ある人がすでに別のコンピューターでそれを実行していて、37バイトの既製のマシンコードを私にくれました。彼はperlスクリプトを使用して以下の形式でバッファーに渡します。私は彼のコードを試しましたが、それは機能しますが、彼はそれを行う方法を教えてくれません。
「\x41\ xc1 \ x30 \ x58 \ x6e \ x61 \ x6d \ x65 \ x23 \ x23 \ xc3 \ xbc \ xa3 \ x83 \ xf4 \ x69 \ x36 \ xw3 \ xde \ x4f \ x2f \ x5f \ x2f \ x39 \ x33 \ x60 \ x24 \ x32 \ xb4 \ xab \ x21 \ xc1 \ x80 \ x24 \ xe0 \ xdb \ xd0” </ p>
彼が別のマシンでそれを行ったので、同じコードを取得することはできませんが、両方がまったく同じc関数を使用しているため、マシンコードのサイズはまったく同じではないにしてもほぼ同じになるはずです。彼のマシンコードは37バイトで、シェルに渡してFreeBSD 2.95のバイナリファイルのgets()関数をオーバーフローさせ、ホスト名をstdoutに出力します。私は同じことをしたいと思っています。彼のマシンコードを試しましたが、動作しますが、彼はこのマシンコードをどのように取得したのか教えてくれません。だから私は実際にそのコードを取得する手順について心配しています。
OKここの投稿で提案されているメソッドを試しましたが、関数gethostname()に対して、130文字のマシンコードを取得しました。printf()マシンコードは含まれていませんでした。ホスト名をコンソールに出力する必要があるため、ホスト名も含める必要がありますが、これによりマシンコードが長くなります。コードを100バイトの配列に収める必要があるため、コードは100バイト未満である必要があります。
100バイト未満のマシンコードに変換する上記のcプログラムのアセンブリコードを書くことができますか?