寫的很亂
1.c語言的運行過程
了解了c語言需要經過以上2個過程(編譯和匯編),才能讓機器按指令運行。機器只能聽得懂機器碼,所以要“匯編”。
那問題就來了,“編譯”這個動作有啥用,c語言這種高級語言,直接進行匯編,變成機器碼不更快嘛
ai回答
雖然直接將C語言匯編為機器碼可能會獲得更高的性能,但編譯過程中的匯編步驟可以提供更好的可移植性、開發效率、優化能力以及代碼可讀性與可維護性。因此,大多數情況下,我們使用C語言編譯為匯編代碼再生成機器碼,以平衡性能和開發效率之間的權衡。
IDA的作用就是反匯編和反編譯(你按f5就是反編譯),要是想理解反匯編,那就去查表,比如0x55就是push ebp,這樣一一對應的關系。
但是反編譯的原理好像就難了
2.大端序和小端序
老師講的這個,我大概理解了,就是大多數據是怎么存放的,大多棧的數據都是低地址對應數據地位,就跟圖小端序一樣。大端序很少見
也就是你按順序輸入的0A0B0C0D,壓入棧后就變成了,0D先壓進去,然后一次。。。
3.IDA小技巧,看c語言的匯編代碼。右鍵之后acc
就比如,這是main函數的反編譯后的代碼
如果你想看他的反匯編代碼那就
按空格,顯示text格式
5.本地調試+遠程調試+靜態分析
產看
調試
發送
寫法也可以是p32(0)+b"45fafasdfsd"
遠程調試
先直接簡單運行一下,也可以看出他的作用,就是把大寫的I邊成了you
然后我們在gdb里面運行調試,我這里安裝了pwndbg的插件,pwn神給的ubuntu
堆入門系列(2)之gdb動態調試_gdb查看heap-CSDN博客
打個斷點b main
b就是break的簡寫,使用方式有b *0x004800(*加地址)
或者 b main(加一個函數)
清楚斷點是
然后運行,用run或者簡寫的r都可以運行
輸入n繼續往下查看,就是next的意思
n 執行下一條指令 ni步入
找到漏洞函數后
s step,si單步步進,然后按n運行,之后stack 24
使用vmmap直接查看該進程的內存空間
RIP 存放當前執行的指令的地址
RSP 存放當前棧幀的棧頂地址
RBP 存放當前棧幀的棧底地址
RAX 通用寄存器。存放函數返回值
6.strings的使用可以更快的查看可見字符,直接搜flag
我沒有例題,但是用法就是,就是如果你shift+f12能看見的,strings就能搜到
7.file也可以看32位還是64位
9.setvbuf()關閉緩沖區,作用是使你更快的運行程序,所以看見就不用管
10.動態調試是為了防止出題人在靜態文件中惡意修改變量的存儲空間
12.PIE保護BSS緩沖區的地址,ASLR保護text和data的緩沖區的地址。
怎么保護呢,就是沒次運行,讓你的標識的地址不一樣,地址隨機偏移一位兩位的
13.多個地址為什么能成功