❶ 怎樣用gdb調試一個由腳本文件啟動的程序
我用makefile寫了個編譯程序,因為makefile自動搜索源文件路徑,所以在寫這個makefile文件時,我的每個源文件 只有文件名,而沒附帶路徑名,說白了,我編譯完成後,我的.h 文件在 /SE/include中,.cpp文件在 /SE/src中, .o文件和 可執行文件在/...
❷ 如何寫gdb命令腳本
首先般命令其實都程序
裝系統路徑程序程序名都作命令直接調用
具體哪些路徑系統路徑Linux用$PATH$命令查看(通路徑用冒號隔)
gdb其實gcc/g++編譯器附帶調試器
雖現主流Linux發行版都自帶gcc編譯器附帶gdb調試器
畢竟算Linux系統內部組件所自能算做Linux自帶命令
❸ 怎樣用GDB調試一個由腳本文件啟動的程序
使用GDB
一般來說GDB主要調試的是C/C++的程序。要調試C/C++的程序,首先在編譯時,我們必須要把調試信息加到可執行文件中。使用編譯器(cc/gcc/g++)的 -g 參數可以做到這一點。如:
$gcc -g -Wall hello.c -o hello
$g++ -g -Wall hello.cpp -o hello
如果沒有-g,你將看不見程序的函數名、變數名,所代替的全是運行時的內存地址。當你用-g把調試信息加入之後,並成功編譯目標代碼以後,讓我們來看看如何用gdb來調試他。
啟動GDB的方法有以下幾種:
gdb <program>
program也就是你的執行文件,一般在當前目錄下。
gdb <program> core
用gdb同時調試一個運行程序和core文件,core是程序非法執行後core mp後產生的文件。
gdb <program> <PID>
如果你的程序是一個服務程序,那麼你可以指定這個服務程序運行時的進程ID。gdb會自動attach上去,並調試他。program應該在PATH環境變數中搜索得到。
以上三種都是進入gdb環境和載入被調試程序同時進行的。也可以先進入gdb環境,在載入被調試程序,方法如下:
*在終端輸入:gdb
*在gdb環境中:file <program>
這兩步等價於:gdb <program>
GDB啟動時,可以加上一些GDB的啟動開關,詳細的開關可以用gdb -help查看。我在下面只例舉一些比較常用的參數:
-symbols <file>
-s <file>
從指定文件中讀取符號表。
-se file
從指定文件中讀取符號表信息,並把他用在可執行文件中。
-core <file>
-c <file>
調試時core mp的core文件。
-directory <directory>
-d <directory>
加入一個源文件的搜索路徑。默認搜索路徑是環境變數中PATH所定義的路徑。
❹ gcc里怎麼用gdb
這位朋友我看是有點誤解了makefile的做用。makefile
是一個腳本,由他來控制編譯出的程序的版本。當你改寫了原文件後,通過makefile
來檢查依賴關系,來生成最終的文件。比如一個程序叫a
他的源碼叫a.c
a.c
又用到頭文件a.h
,a.h是1.h和2.h生成的如果你改寫了1.h,通過編寫makefile文件。make時會調用makefile來依此按依賴關系生成最後的a所以說編譯時程序並不知道生成a都用到什麼。怎麼可能自己生成呢。makefile是要你自己編寫的,來告訴make來如何編譯。make工具就相當於一個腳本。
gcc里怎麼用gdb?這里有視頻教程可以看下
http://www.alisoho.com
❺ linux 怎麼打開gdb的layout
gdb是用來調試二進製程序的,不能調試python腳本。 python自帶pdb模塊,可以用來調試自己的腳本。 使用python -m pdb ,交互方式,命令與gdb類似。
❻ shell腳本中怎麼判斷發行版
A:本腳本運行的機器,Linux
B:待安裝JDK的機器, Linux
首先在腳本運行的機器A上確定可以ssh無密碼登錄到待安裝jdk的機器B上,然後就可以在A上運行本腳本:
復制代碼 代碼如下:
$ ./install-jdk.sh B的IP
or:
復制代碼 代碼如下:
$ ./install-jdk.sh "B的IP" "JDK的URI"
就可以在機器B上安裝JDK。jdk使用的tar包需要用戶自己設定DEFAULT_JDK_SRC=?,保證可以wget得到即可。下面是全部腳本內容:
復制代碼 代碼如下:
#!/bin/bash
#
# @file
# install-jdk.sh
#
# @date
# 2013-12-19
#
# @author
# cheungmine
#
# @version
# 0.0.1pre
#
# @usage:
# ./install-jdk.sh 192.168.122.206
#
################################################################################
. common.sh
#***********************************************************
# install_jdk
# install jdk on machine: /usr/local/lib
#
# Parameters:
# machine - root@ipaddr
# jdkUri - uri for fetching tarball
#
# Example:
#
# install_jdk [email protected] ftp://vm-ftp/pub/tarball/jdk-7u67-linux-x64.tar.gz
#
#***********************************************************
. common.sh
# YOU MIGHT CHANGE BELOW LINE TO GET YOUR JDK TARBALL:
DEFAULT_JDK_SRC="ftp://vm-ftp/pub/tarball/jdk-7u67-linux-x64.tar.gz"
# DO NOT CHANGE BELOW TWO LINES:
INSTALL_DIR="/usr/local/lib/java"
LOCAL_DIR="./.tmp"
function install_jdk() {
echo -e "<INFO> install jdk on machine: $1"
local DEST_LOGIN=$1
local JDK_URI=$2
local TAR=$(basename $JDK_URI)
echo -e "<INFO> jdk: '$JDK_URI'"
wget -c $JDK_URI -P $LOCAL_DIR -O $LOCAL_DIR/$TAR
$(is_empty_dir "$LOCAL_DIR/jdk_untar")
local ret=$?
case $ret in
$DIR_NOT_EXISTED)
mkdir -p $LOCAL_DIR/jdk_untar
;;
$DIR_IS_EMPTY)
;;
$DIR_NOT_EMPTY)
rm -rf $LOCAL_DIR/jdk_untar/*
;;
*)
exit $ERR_FATAL_ERROR
;;
esac
# untar to jdk_untar
tar -zxf $LOCAL_DIR/$TAR -C $LOCAL_DIR/jdk_untar
$(is_empty_dir "$LOCAL_DIR/jdk_untar")
local ret=$?
if [ "$ret" -eq "$DIR_NOT_EMPTY" ]; then
local jdk_home=`ls $LOCAL_DIR/jdk_untar 2>/dev/null`
echo $jdk_home
else
exit $ERR_FATAL_ERROR
fi
echo -e "<INFO> create folder on: $DEST_LOGIN:$INSTALL_DIR"
local ret=`ssh $DEST_LOGIN "mkdir $INSTALL_DIR"`
echo -e "<INFO> $jdk_home/ to: $DEST_LOGIN:$INSTALL_DIR/"
local ret=`scp -r $LOCAL_DIR/jdk_untar/$jdk_home $DEST_LOGIN:$INSTALL_DIR`
# remove local tar
rm -rf $LOCAL_DIR/jdk_untar
local DEST_JAVA_HOME=$INSTALL_DIR/$jdk_home
echo -e "<TODO> remove old settings for install_jdk in /etc/profile"
echo -e "<INFO> set /etc/profile: JAVA_HOME=$DEST_JAVA_HOME"
local ret=`ssh $DEST_LOGIN "echo '' >> /etc/profile"`
local ret=`ssh $DEST_LOGIN "echo '#!{{[email protected]==>' >> /etc/profile"`
local ret=`ssh $DEST_LOGIN "echo 'export JAVA_HOME=$DEST_JAVA_HOME' >> /etc/profile"`
local ret=`ssh $DEST_LOGIN "echo 'export CLASSPATH=.:\\$JAVA_HOME/lib/tools.jar:\\$JAVA_HOME/lib/dt.jar' >> /etc/profile"`
local ret=`ssh $DEST_LOGIN "echo 'export PATH=\\$JAVA_HOME/bin:\\$JAVA_HOME/jre/bin:\\$PATH' >> /etc/profile"`
local ret=`ssh $DEST_LOGIN "echo '#!<[email protected]}}'>> /etc/profile"`
local ret=`ssh $DEST_LOGIN ". /etc/profile"`
}
function uninstall_jdk() {
echo -e "<TODO> uninstall jdk from: $1"
}
#=======================================================================
# ---- main() ----
if [ -n $1 ]; then
DEST_IP=$1
JDK_SRC=$DEFAULT_JDK_SRC
if [ $# == 2 ]; then
JDK_SRC=$2
fi
echo -e "<INFO> install jdk on '$DEST_IP', jdk: '$JDK_SRC'"
install_jdk "root@$DEST_IP" "$JDK_SRC"
fi
❼ cisco ios rootkit工具該怎麼寫
一個人如何能相對簡單地利用自己的固件來創建一個rootkit工具。
HT文本編輯器:
apt-get install ht hexedit
Dynamips + GDB Stub: git clone https://github.com/Groundworkstech/dynamips-gdb-mod
程序員計算器:
http://pcalc.sourceforge.net/
Binutils / Essentials: apt-get install gcc gdb build-essential binutils \ binutils-powerpc-linux-gnu binutils-multiarch
其他依賴項:
apt-get install libpcap-dev uml-utilities libelf-dev libelf1
QEMU: apt-get install qemu qemu-common qemuctl qemu-system \qemu-system-mips qemu-system-misc qemu-system-ppc qemu-system-x86
Debian PowerPC 鏡像:
wget https://people.debian.org/~aurel32/qemu/powerpc/debian_wheezy_powerpc_standard.qcow2
QEME還需要下面的額外設置:
# cd /usr/share/qemu/
# mkdir ../openbios/
# mkdir ../slof/
# mkdir ../openhackware/ # cd ../openbios/
# wget https://github.com/qemu/qemu/raw/master/pc-bios/openbios-ppc
# wget https://github.com/qemu/qemu/raw/master/pc-bios/openbios-sparc32 # wget https://github.com/qemu/qemu/raw/master/pc-bios/openbios-sparc64
# cd ../openhackware/
# wget https://github.com/qemu/qemu/raw/master/pc-bios/ppc_rom.bin # cd ../slof/
# wget https://github.com/qemu/qemu/raw/master/pc-bios/slof.bin
# wget https://github.com/qemu/qemu/raw/master/pc-bios/spapr-rtas.bin
QEME客戶機應如下設置:
qemu-host# qemu-system-ppc -m 768 -hda debian_wheezy_powerpc_standard.qcow2
qemu-guest# apt-get update
qemu-guest# apt-get install openssh-server gcc gdb build-essential binutils-multiarch binutils qemu-guest# vi /etc/ssh/sshd_config
qemu-guest# GatewayPorts yes
qemu-guest# /etc/init.d/ssh restart
qemu-guest# ssh -R 22222:localhost:22 <you>@<qemu-host>
把你的開發設備SSH到埠22222,並作為根用戶登錄到QEMU客戶機。這樣在編輯文件,進行復制和粘貼操作時會更容易,因為不需要切換到QEMU窗口上。
Dynamips + GDB Stub需要進行編譯。接下來的操作也需要在amd64機器上進行:更改配置以滿足開發設備的要求。
# git clone https://github.com/Groundworkstech/dynamips-gdb-mod Cloning into 'dynamips-gdb-mod'...
remote: Counting objects: 290, done.
remote: Total 290 (delta 0), reused 0 (delta 0), pack-reused 290 Receiving objects: 100% (290/290), 631.30 KiB | 0 bytes/s, done. Resolving deltas: 100% (73/73), done.
Checking connectivity... done.
# cd dynamips-gdb-mod/src
# DYNAMIPS_ARCH=amd64 make
Linking rom2c
cc: error: /usr/lib/libelf.a: No such file or directory make: *** [rom2c] Error 1
# updatedb
# locate libelf.a /usr/lib/x86_64-linux-gnu/libelf.a
# cat Makefile |grep "/usr/lib/libelf.a"
LIBS=-L/usr/lib -L. -ldl /usr/lib/libelf.a $(PTHREAD_LIBS)
LIBS=-L. -ldl /usr/lib/libelf.a -lpthread
# cat Makefile | sed -e 's#/usr/lib/libelf.a#/usr/lib/x86_64-linux-gnu/libelf.a#g' >Makefile.1
# mv Makefile Makefile.bak
# mv Makefile.1 Makefile
# DYNAMIPS_ARCH=amd64 make
接下來,我們需要使用一個簡單的腳本來計算二進制的校驗和,因為隨後我們還會用到這些二進制。把校驗和保存到chksum.pl文件中,並放到開發目錄下。通過chmod +x把這個文件轉換成一個可執行文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/perl
sub checksum {
my $file = $_[0];
open(F, "< $file") or die "Unable to open $file ";
print "\n[!] Calculating the checksum for file $file\n\n";
binmode(F);
my $len = (stat($file))[7];
my $words = $len / 4;
print "[*] Bytes: \t$len\n";
print "[*] Words: \t$words\n";
printf "[*] Hex: \t0x%08lx\n",$len;
my $cs = 0;
my ($rsize, $buff, @wordbuf);
for(;$words; $words -= $rsize) {
$rsize = $words < 16384 ? $words : 16384;
read F, $buff, 4*$rsize or die "Can't read file $file : $!\n";
@wordbuf = unpack "N*",$buff;
foreach (@wordbuf) {
$cs += $_;
$cs = ($cs + 1) % (0x10000 * 0x10000) if $cs > 0xffffffff;
}
}
printf "[*] Checksum: \t0x%lx\n\n",$cs;
return (sprintf("%lx", $cs));
close(F);
}
if ($#ARGV + 1 != 1) {
print "\nUsage: ./chksum.pl <file>\n\n";
exit;
}
checksum($ARGV[0]);
另外還有幾個資源也是必需的,但是我們無法在文章中給出鏈接。不過,你應該能找到這些資源,並且在設置上也不會遇到任何問題。接著,你需要把這些資源安裝到用於開發的虛擬機上,然後創建一個Windows7客戶機。一旦你完成了設置,就登錄到你的Windows虛擬機,並安裝「IDA Pro 6.6 + Hex-Rays Decompiler」或其他的任意版本——確保你安裝的是完整版,能支持x86/x64以外的架構,因為我們主要使用的是PowerPC匯編語言。請不要破解IDA軟體,IDA是一款非常好用的程序,值的我們的購買。
最後,你需要一個IOS鏡像。我們使用的鏡像來自我們購買的Cisco 2600,文件名是 「c2600-bino3s3-mz.123-22.bin」。我們強烈建議你登錄你的Cisco賬戶,然後下載這一個鏡像-使用同一個鏡像能保證你完全根據我們的要求進行操作,並且偏移、校驗和、長度等也都是一致的。眾所周知,在一些社區中下載到的一些所謂「僅供學習」的IOS鏡像,以及具有更多功能的IOS鏡像,實際上都植入了木馬。除了通過哈希來驗證,我們還建議你使用FX的『Cisco Incident Response』來驗證你的IOS鏡像。
對於我們的開發設備,提示是 "[ 3812149161f@decay ]# 「;QEMU請求,提示是"[debian@ppc ]#。
0x03 開發
❽ 如何寫gdb命令腳本
GDB是一個強大的命令行調試工具。雖然X Window提供了GDB的圖形版DDD,但是我仍然更鍾愛在命令行模式下使用GDB。大家知道命令行的強大就是在於,其可以形成執行序列,形成腳本。UNIX下的軟體全是命令行的,這給程序開發提代供了極大的便利,命令行軟體的優勢在於,它們可以非常容易的集成在一起,使用幾個簡單的已有工具的命令,就可以做出一個非常強大的功能。
於是UNIX下的軟體比Windows下的軟體更能有機地結合,各自發揮各自的長處,組合成更為強勁的功能。而Windows下的圖形軟體基本上是各自為營,互相不能調用,很不利於各種軟體的相互集成。在這里並不是要和Windows做個什麼比較,所謂「寸有所長,尺有所短」,圖形化工具還是有不如命令行的地方。
1 GDB概述
GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像VC、BCB等IDE的調試,但如果你是在 UNIX平台下做軟體,你會發現GDB這個調試工具有比VC、BCB的圖形化調試器更強大的功能。所謂「寸有所長,尺有所短」就是這個道理。
一般來說,GDB主要幫忙你完成下面四個方面的功能:
1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
3、當程序被停住時,可以檢查此時你的程序中所發生的事。
4、動態的改變你程序的執行環境。
❾ 如何使用gdb調試android程序
首先到gdb的官方下載gdb的源代碼
下載後解壓源代碼,在終端下使用命令安裝編譯gdb所需的軟體包。
sudo apt-get install bison flex libncurses5-dev texinfo gawk libtool
編譯gdb時不要使用自帶的多線程庫thread_db.c,應使用Android NDK中的修改版本,位於Android NDk 的sources/android/libthread_db/gdb-7.3.x/libthread_db.c,為了避免兼容性的問題,將其編譯成靜態庫,配置gdb編譯腳本如下
export TOOLCHAIN_PATH=/home/android/tools/android/android-ndk-r8b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
export PATH=$TOOLCHAIN_PATH/bin:$PATH
export SYSROOT=/home/android/tools/android/android-ndk-r8b/platforms/android-14/arch-arm
export TOOLCHAIN_PREFIX=$TOOLCHAIN_PATH/bin/arm-linux-androideabi
export CC="$TOOLCHAIN_PREFIX-gcc --sysroot=$SYSROOT"
export AR="$TOOLCHAIN_PREFIX-ar"
$CC -o $SYSROOT/usr/lib/libthread_db.o -c /home/android/tools/android/android-nkd-r8b/sources/android/libthread_db/gdb-7.3.x/libthread_db.c
$AR -r $SYSROOT/usr/lib/ibthread_db.a $SYSROOT/usr/lib/libthread_db.o
#配置gdb編譯腳本
./configure --target=arm-elf-linux --enable-static --disable-stripping -with-libthread-db=$SYSROOT/usr/lib/libthread_db.a
"--target=arm-elf-linux" 指定了被調試的程序運行的系統平台,「--enable-static」指定了靜態編譯,「--disable-stripping」指定禁止剝離符號信息,「--with-libthread-db」手動指定多線程庫文件,在終端上依次執行以上命令會聲稱makefile 我呢間,接下來還需要手動修改gdb-7.3.1/gdb目錄下的remote.c文件,找到process_G_packet()函數的代碼,將一下的內容
if(but_len>2*rsa->sizeof_g_packet)
error(_("Remote 'g' packet reply is too long:%s"),rs->but);
修改為
if(but_len>2*rsa->sizeof_g_packet)
{
rsa->sizeof_g_packet=buf_len;
for(i=0;i<gdbarch_num_regs (gdbarch);i++)
{
if(rsa->regs[i].pnum==-1)
continue;
if(rya->regs[i].offset>=rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet=0;
else
rsa->regs[i].in_g_packet=1;
}
}
修改保存後,在終端上執行make編譯gdb
單獨使用gdb還不能調試android原生程序 還需要編譯gdbserver,這個的源代碼在 gdb-7.3.1/gdb/gdbserver 目錄下,在終端下執行一下命令配置gdbserver編譯腳本
export CC="$TOOLCHAIN_PREFIX-gcc --sysroot=$SYSROOT"
export CFLAGS="-02 -D__ANDROID__ -DANDROID -DSTDC_HEADERS -D__GLIBC__"
./configure --host=arm-linux-androideabi --with-libthread-db=$SYSROOT/usr/lib/libthread_db.a
命令執行完成後會在gdb-7.3.1/gdb/gdbserver 目錄下聲稱makefile文件,打開該文件找到 WERROR_CFLAGS的定義,將它的值清空,然後打開config.h文件,將「/*#undef HAVE_LWPID_T */」改為「#define HAVE_LWPID_T 1」,修改後保存,然後在終端下執行make編譯gdbserver.
下面介紹如何調試,首先准備一個android app,這個用一個名為testapp的程序,在終端下執行以下兩個命令將testapp與gdbserver復制到android石碑的/data/local/tmp目錄
adb push test app /data/local/tmp
dab push gdbserver /data/local/tmp
執行以下兩行命令給兩個文件加上可執行許可權
adb shell chmod 755 /data/local/tmp/testapp
adb shell chnod 755 /data/local/tmp/gdbserver
接著執行 「adb shell /data/local/tmp/gdbserver:12345 /data/local/tmp/testapp」,啟動dgb調試伺服器,會輸入如下信息
Process /data/local/tmp/testapp create; pid=292
Listening on port 12345
程序其實調試伺服器已經啟動,並且監聽了12345號埠,打開另一個終端窗口執行以下命令開啟埠轉發
dab forward tcp:12345 tcp:12345
在pc 端的終端下執行./gdb啟動gdb調試器,然後執行以下命令連接gdb調試伺服器
target remote localhost:12345
命令執行後會輸出
(gdb) target remote localhost:12345
Remote debugging using localhost:12345
warning: Can not parse XML target description; XML support was disabled at compile time
0xb000100 in ?? ()
(gdb)
使用 ida pro 或者objmp 找到程序main()函數地址,例如 0x8580,在gdb Shell 環境下執行命令「b *0x8580」 在main()函數的第一行上設置斷點,輸出信息如下
(gdb) b *0x8580
Breakpoint 1 at 0x8580
(gdb)
斷點設置完成後輸入continue 讓程序繼續執行,輸出信息如下
(gdb)continue
Continuing.
Program received signal SIGSEGV,Segmentation fault.
0x00008584 in ??()
執行"set disassemble-next on "設置反匯編顯示代碼,然後執行「dosas 0x8580,+20」顯示0x8580以下20各字元的反匯編代碼,輸出信息如下
(gdb)disas 0x8580,+20
Dump of assembler code from 0x8580 to 0x8594
0x00008580:ldr r0,[pc,#16] ;0x8598
=> 0x00008584:push {r4,lr}
0x00008588:add r0,pc,r0
0x0000858c:bl 0x84f8
0x00008590:mov r0,#0
End of assembler mp.
(gdb)
接下來可以輸入si或者ni 命令來單步調試了