滴水逆向筆記系列-c語言總結2-10.變數-11.if逆向-12.正向基礎

小新07發表於2024-03-14

第十課 c語言3

1.編碼

ASCII

標準的ASCII編碼只需要七位,第八位在擴充ASCII編碼使用
image.png
image.png

GB2312

image.png
image.png

2.區域性變數和全域性變數

下面程式碼輸出結果為1111(x=11改變了全域性的x)
image.png
452136177.jpg
452138067.jpg

第十一課 c語言4

1.記憶體圖

image.png

2.逆向引數個數

472327817.jpg

3.簡單逆向if程式碼

472363432.jpg

4.if...else...反彙編判斷

image.png

  • 跳轉執行一部分程式碼,不跳轉則執行另外一部分程式碼
  • 第一個jxx命令跳轉的地址前面有一個jmp,則可以判斷是if...else...語句

練習示例

image.png

5.if..else if....else if..反編譯判斷

image.png

  • 當每個jxx命令跳轉指令要跳轉的地址前面都有jmp命令
  • 這些jmp指令跳轉的地址都是一樣的
  • 如果某個分支沒有條件判斷,則為else部分

6、迴圈反彙編

for迴圈

image.png

while迴圈

image.png

do...while迴圈

image.png

作業

image.png
image.png

1、ebp+8,ebp+c
2、ebp-4
3、[004225c4]
4、如果[ebp+8]大於[ebp+c],則跳轉到00401064,否則[ebp+c]與[ebp-4]相加,把結果放入全域性變數[004225c4]
5、
image.png
1、分析引數
[ebp+8]a、[ebp+c]b
2、分析區域性變數
[ebp-4]x、[ebp-8]y
3、分析全域性變數
[004225c4]c
4、功能分析
x=c,y=2,若a>=b則y++,若a>=b則c=x+y,則否則c=y,
5、返回值分析
全域性變數被修改
6、還原成c

int c;
int function(int x,int y)
{
	int x = c;
    int y = 2;
    if(a>=b)
    {
        y++;
    }
    if(a>=b)
    {
        c = x+y;
    }
    else
    {
        c = y;
    }
}

image.png
1、分析引數
[ebp+8]x、[ebp+c]y、[ebp+10]i
2、分析區域性變數
[ebp-4]a、[ebp-8]b、[ebp-c]c
3、分析全域性變數

4、功能分析
a=0,b=1,c=2,若x<=y,a=b-1且跳到00401123,否則(若y>=i則a=c+1且跳轉00401123,否則(若x>i則a=b+c且跳轉00401123,否則))最後00401123地址是return a+1
5、返回值分析

6、還原成c

int function(int x , int y , int i)
{
	int a = 0;
    int b = 1;
    int c = 2;
    if(x<=y)
    {
        a=b-1;
    }
    else if(y>=i)
    {
        a = c + 1;
    }
    else if(x>i)
    {
        a = b + c;
    }
    else
    {
        a = b + c - 1;
    }
    return a + 1;
}

http://lihuaxi.xjx100.cn/news/1334730.html?action=onClick

第十二課 c語言5(正向基礎)

1.型別轉換(movsx,movzx)

小轉大

image.png

  • movsx使用符號位先填上,再把資料傳過去
  • movzx使用0先填上,再把資料傳過去

image.png
image.png
image.png
image.png
image.png
image.png

大轉小

image.png
高位會丟失

表示式

  • 運算中表示式會以最大寬度存放資料

image.png

  • 當表示式同時存在有符號數和無符號數時,表示式的結構將轉換成無符號數

image.png

疑點

image.pngimage.pngimage.png
海哥這裡講亂了,是因為%d是有符號輸出,想要輸出無符號要用%u

2.迴圈

  • for迴圈執行順序

image.png
注:迴圈變數放在裡面和外面的區別
image.png

作業

嘗試執行後解釋其執行結果
1、
image.png
從ebp-14開始存,到ebp-4是陣列最後一個值,越界一個陣列將存到ebp,越界兩個陣列將存到ebp+4,也就是eip的地址
-331353660.jpg
2、
image.png

image.png
2、image.png

相關文章