アセンブラでコードを記述せずにシェルコードを構築することは可能ですか?私は以下のような簡単なアプリケーションのコンパイルしようとしたアセンブラを使わずにシェルコードを構築する
:
#include <stdlib.h>
int main(int argc, char** argv)
{
char* args[] = { "/bin/bash", NULL };
execve("bin/bash", &args, NULL);
return 0;
}
をそれから私はそれをコンパイルし、次のように取得するためにGDBを使用:
(gdb) x/15i main
0x400506 <main>: push %rbp
0x400507 <main+1>: mov %rsp,%rbp
=> 0x40050a <main+4>: sub $0x20,%rsp
0x40050e <main+8>: mov %edi,-0x14(%rbp)
0x400511 <main+11>: mov %rsi,-0x20(%rbp)
0x400515 <main+15>: movq $0x4005d4,-0x10(%rbp)
0x40051d <main+23>: movq $0x0,-0x8(%rbp)
0x400525 <main+31>: lea -0x10(%rbp),%rax
0x400529 <main+35>: mov $0x0,%edx
0x40052e <main+40>: mov %rax,%rsi
0x400531 <main+43>: mov $0x4005de,%edi
0x400536 <main+48>: callq 0x4003f0 <[email protected]>
0x40053b <main+53>: mov $0x0,%eax
0x400540 <main+58>: leaveq
0x400541 <main+59>: retq
残念ながら、私はシェルコードを生成し、これを使用することはできません、グローバルオフセットテーブル[main + 48]が使用されているためです。
アセンブリに戻ることなくシェルコードを生成するには、どうすればこの方法を修正できますか。
シェルコードとして直接使用することができます。 – fuz