## page was renamed from CTF/inside/Toolkit/ndisasm ## page was renamed from CTF/Toolkit/ndisasm = ndisasm = ndisasmはnasmに付属する逆アセンブラである。x86系の16-, 32-, 64-bit modeに対応している。 シェルコードのようなコードの断片の逆アセンブルに向いている。 == 使い方 == デフォルトでは16-bit modeで逆アセンブルするので必ず`-b`でビットを指定する。 ファイル名として`-`を指定すると標準入力から読み取る。 x86の場合 {{{ $ ndisasm -b 32 file }}} {{{ $ ndisasm -u file }}} でもよい。 x86-64の場合 {{{ $ ndisasm -b 64 -p amd file }}} `-p amd`をつけておかないとsyscallがloadall286になるなど。 == ずれる場合 == 文字列などが挟まっていて、命令の開始位置ずれる場合には`-s`で正しい位置を指定するか、文字列部分を`-k`で読み飛ばす。 次のコード片を逆アセンブルしてみる。 {{{#!highlight nasm BITS 64 jmp main sh: db '/bin/sh',0 main: mov eax,0x3b ; execve lea rdi,[rel sh] mov esi,0 mov edx,0 syscall }}} {{{ $ ndisasm -b64 -pamd sc 00000000 EB08 jmp short 0xa 00000002 2F db 0x2f 00000003 62 db 0x62 00000004 696E2F736800B8 imul ebp,[rsi+0x2f],dword 0xb8006873 0000000B 3B00 cmp eax,[rax] 0000000D 0000 add [rax],al 0000000F 488D3DECFFFFFF lea rdi,[rel 0x2] 00000016 BE00000000 mov esi,0x0 0000001B BA00000000 mov edx,0x0 00000020 0F05 syscall }}} jump先の0xaが前の文字列とくっついてしまっている。 `-s 0xa`で0xaからが一つの命令であることを指示する。 {{{ $ ndisasm -b64 -pamd sc -s 0xa 00000000 EB08 jmp short 0xa 00000002 2F db 0x2f 00000003 62 db 0x62 00000004 69 db 0x69 00000005 6E outsb 00000006 2F db 0x2f 00000007 7368 jnc 0x71 00000009 00 db 0x00 0000000A B83B000000 mov eax,0x3b 0000000F 488D3DECFFFFFF lea rdi,[rel 0x2] 00000016 BE00000000 mov esi,0x0 0000001B BA00000000 mov edx,0x0 00000020 0F05 syscall }}} あるいは`-k 2,8`で2バイト目から8バイト分をskipする。 {{{ $ ndisasm -b64 -pamd sc -k 2,8 00000000 EB08 jmp short 0xa 00000002 skipping 0x8 bytes 0000000A B83B000000 mov eax,0x3b 0000000F 488D3DECFFFFFF lea rdi,[rel 0x2] 00000016 BE00000000 mov esi,0x0 0000001B BA00000000 mov edx,0x0 00000020 0F05 syscall }}}