1. 程式人生 > >linux 反彙編分析變數地址並用gdb修改執行中的程式記憶體變數實驗

linux 反彙編分析變數地址並用gdb修改執行中的程式記憶體變數實驗

準備樣本檔案:

a.c

#include <stdio.h>
#include <unistd.h>

unsigned int a=0xFFFFFFFF;
unsigned int b=0xEEEEEEEE;


void main(){
        while(1){
        printf("%x, %x\n", a, b);
        sleep(1);
        }
}

編譯可執行程式:
gcc -g a.c

執行a.out輸出:
$ ./a.out 
ffffffff, eeeeeeee
ffffffff, eeeeeeee
ffffffff, eeeeeeee
ffffffff, eeeeeeee
ffffffff, eeeeeeee

開始分析變數a

1. gcc反彙編a.out

$ objdump -D a.out > a.S

2. 檢視main函式反彙編程式碼
0000000000400586 <main>:
  400586:       55                      push   %rbp
  400587:       48 89 e5                mov    %rsp,%rbp
  40058a:       8b 15 b0 0a 20 00       mov    0x200ab0(%rip),%edx        # 601040 <b>
  400590:       8b 05 a6 0a 20 00       mov    0x200aa6(%rip),%eax        # 60103c <a>
  400596:       89 c6                   mov    %eax,%esi
  400598:       bf 50 06 40 00          mov    $0x400650,%edi
  40059d:       b8 00 00 00 00          mov    $0x0,%eax
  4005a2:       e8 a9 fe ff ff          callq  400450 <
[email protected]
> 4005a7: bf 01 00 00 00 mov $0x1,%edi 4005ac: e8 cf fe ff ff callq 400480 <[email protected]> 4005b1: eb d7 jmp 40058a <main+0x4> 4005b3: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 4005ba: 00 00 00 4005bd: 0f 1f 00 nopl (%rax)

或者直接看.data段
Disassembly of section .data:

0000000000601038 <__data_start>:
  601038:       00 00                   add    %al,(%rax)
        ...

000000000060103c <a>:
  60103c:       ff                      (bad)
  60103d:       ff                      (bad)
  60103e:       ff                      (bad)
  60103f:       ff                      (bad)

0000000000601040 <b>:
  601040:       ee                      out    %al,(%dx)
  601041:       ee                      out    %al,(%dx)
  601042:       ee                      out    %al,(%dx)
  601043:       ee                      out    %al,(%dx)

得到變數a地址:60103c

3. 得到程序id:

$ ps aux | grep a.out
yeqiang  22726  0.0  0.0   4172   688 pts/10   S+   17:00   0:00 ./a.out

4. gdb 調式改程序,直接修改記憶體資料
$ gdb -p 22726
GNU gdb (GDB) Fedora 7.9.1-20.fc22
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
Attaching to process 22726
Reading symbols from /tmp/a.out...done.
Reading symbols from /lib64/libc.so.6...Reading symbols from /usr/lib/debug/usr/lib64/libc-2.21.so.debug...done.
done.
Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/usr/lib64/ld-2.21.so.debug...done.
done.
0x00007fd7f0192d20 in __nanosleep_nocancel ()
    at ../sysdeps/unix/syscall-template.S:81
81	T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
(gdb) p/x *0x60103c
$3 = 0xffffffff
(gdb) set *0x60103c=1
(gdb) c
Continuing.


5. 觀察程式輸出:

ffffffff, eeeeeeee
ffffffff, eeeeeeee
ffffffff, eeeeeeee
ffffffff, eeeeeeee
ffffffff, eeeeeeee
ffffffff, eeeeeeee
1, eeeeeeee
1, eeeeeeee
1, eeeeeeee
1, eeeeeeee
1, eeeeeeee
1, eeeeeeee
1, eeeeeeee
1, eeeeeeee
1, eeeeeeee

搞定。

相關推薦

linux 彙編分析變數地址並用gdb修改執行程式記憶體變數實驗

準備樣本檔案: a.c #include <stdio.h> #include <unistd.h> unsigned int a=0xFFFFFFFF; unsigned

一個簡單程式gdb 彙編 分析

《深入理解計算機》的第三章已經看了兩遍了,一直都是在看書裡的程式,一些內容都是第一次接觸,也一直沒有在真正的Linux上用過,今天寫了下發現和書裡的還是有些出入,下面是我自己的理解。 gdb除了反彙編外,還可以用於程式碼的除錯。下面就簡單記錄下容易忘記的部分。 1.gcc -

Android Smali彙編分析與除錯

很多Android APK由於加密了(比如加了花指令), 無法反彙編為Java程式。此時只能檢視Smali原始碼, 用Smali原始碼進行除錯分析。   smali以及baksmali的jar包用法 baksmali下載:jar包下載地址 命令列:java -jar baksm

LPC824 ROM-bootloader彙編分析

1 ROM-bootloader反彙編分析 在Keil中(IAR暫不能實現,其他IDE未曾嘗試,本部分內容集中在對程式碼分析上,無需對工具軟體進行過多考慮)取消Option的Debug標籤頁上的“Run to main”選項,並且在Setting中選擇Stop after

C庫字串彙編分析

FROM:http://bbs.pediy.com/showthread.php?t=127475 1、strlen .text:00408150                 mov     ecx, [esp+arg_0] .text:00408154  

linux彙編除錯

反彙編有有以下幾種方法: 1.使用gcc -S test.c 或者gcc -S test.c>out.txt 2.使用gdb除錯,在除錯中輸入disass 函式名 就可以 3.objdump -D test 一般常用1,2兩種, ~~~~~C語言程式碼example.

switch語句彙編分析

假設switch語句的分支比較少的時候(例如3,少於4的時候沒有意義)沒有必要使用此結構,相當於if(可觀察反彙編得出此結論)。 1、各個分支常量的差值較大的時候,編譯器會在效率還是記憶體進行取捨,這個時候編譯器還是會編譯成類似於if,else的結構。 2、在分支比較多的時

C語言三種迴圈彙編分析

#include <stdio.h> #include <stdlib.h> int main() { 00AB13D0  push        ebp   00AB13D1  mov         ebp,esp   00AB13D3  sub

mingw32 exception在sjlj與dwarf差別-彙編分析

sjlj (setjump/longjump)與dwarf-2為mingw32兩種異常處理模型的實現。sjlj有著開銷,而隨linux發行的mingw32開發庫包都是用sjlj版編譯的,而Qt卻採用dwarf-2版,那麼兩者之間有多少差異,本文就這問題對兩版的異常程式碼的反彙編進行分析比較。 我使用mingw

解決Linux關閉終端(關閉SSH等)後執行程式或者服務自動停止【後臺執行程式

 問題描述:當SSH遠端連線到伺服器上,然後執行一個服務 ./catalina.sh start,然後把終端開閉(切斷SSH連線)之後,發現該服務中斷,導致網頁無法訪問。 解決方法:使用nohup命令讓程式在關閉視窗(切換SSH連線)的時候程式還能繼續在後臺執行。

JNI獲取並修改Java類的變數和靜態變數的值

對於JNI的基本使用請移步:Hello JNI 本文主要介紹以下幾個函式的使用: GetObjectClass GetFieldID,GetStaticFieldID Get< Type>Field,GetStatic<

LINUX平臺可以用GDB進行彙編和除錯。

如果在Linux平臺可以用gdb進行反彙編和除錯。(轉) 2. 最簡C程式碼分析     為簡化問題,來分析一下最簡的c程式碼生成的彙編程式碼:     # vi test1.c            int main()     {         return 0;     }            

linux核心分析》作業一:彙編一個C語言程式分析彙編程式碼執行過程

楊新峰原創作品轉載請註明出處  《Linux核心分析》 MOOC課程http://mooc.study.163.com/course/USTC-1000029000  實驗環境:實驗樓網站64位linux虛擬機器 原始碼如下: int g(int x){ re

簡單例項分析objdump彙編用法

objdump -rdS 可可執行檔案   objdump命令是用檢視目標檔案或者可執行的目標檔案的構成的gcc工具。   1. 準備程式碼hello.c #include <linux/module.h> #include <linux/

彙編C++ OOP程式碼 分析建構函式如何被呼叫 以及簡單的C++物件記憶體模型

在今天進行C++程式碼的思考時,產生一個疑問,就是C++類的建構函式是如何被呼叫的 於是就做了一個簡單的實驗來驗證自己的想法。 //main.cpp #include &lt;stdio.h&gt; class People{ private: int i; i

彙編演算法介紹和應用——線性掃描演算法分析

        做過逆向的朋友應該會很熟悉IDA和Windbg這類的軟體。IDA的強項在於靜態反彙編,Windbg的強項在於動態除錯。往往將這兩款軟體結合使用會達到事半功倍的效果。可能經常玩這個的朋友會發現IDA反彙

彙編演算法介紹和應用——遞迴下降演算法分析

上一篇博文我介紹了Windbg使用的線性掃描(linear sweep)反彙編演算法。本文我將介紹IDA使用的遞迴下降(recursive descent)反彙編演算法。(轉載請指明來源於breaksoftware的csdn部落格)       &

Linux gcc for 迴圈 i=i++ 會造成死迴圈問題及 ++i / i++ 彙編分析

在把 Windows 程式移植到 Linux 時遇到了死迴圈,最後定位到了類似這種的語句 for (i = 0; i < 1; i = i++), 別問我是誰寫的,為什麼這麼寫(淚目!)。 根據我自己的感覺, i = i++ 應該等價於 i++(C標準中 i=i++ 的行為未

《C++彙編與逆向分析技術揭祕》讀書總結——建構函式與解構函式

建構函式的必要條件: 這個函式的呼叫,是這個物件在作用域內的第一次成員函式呼叫,看this指標即可以區分物件,是哪個物件的this指標就是哪個物件的成員函式。 使用thiscall呼叫方式,使用ecx傳遞this指標; 返回值為this指標。 解構函式的必要條件: 這

彙編程式碼分析之CVE-2012-0774

0x00 序言 最近在看CVE-2012-0774這個洞,其中一個函式的反彙編是這樣的,看上去有點懵逼,知道邏輯不難,就是無從下手。 0x01 原始碼 在IDA中看函式 sub_800798B 只有一處上層引用 具體原始碼如下 int __cdecl sub_80079