經過很多時間和思考,我終於解決了這個問題。幫助我解決這個問題的資源是Stack smashing code not working on Linux kernel 2.6.38.7... Please help
幫助我解決這個問題的最大變化是使用disassembly-flavor intel
爲gdb
。
反彙編代碼(僅供參考):
0804840c <function>:
804840c: 55 push ebp
804840d: 89 e5 mov ebp,esp
804840f: 83 ec 10 sub esp,0x10
8048412: 8d 45 f7 lea eax,[ebp-0x9]
8048415: 83 c0 14 add eax,0x14
8048418: 89 45 fc mov DWORD PTR [ebp-0x4],eax
804841b: 8b 45 fc mov eax,DWORD PTR [ebp-0x4]
804841e: 8b 00 mov eax,DWORD PTR [eax]
8048420: 8d 50 05 lea edx,[eax+0x5]
8048423: 8b 45 fc mov eax,DWORD PTR [ebp-0x4]
8048426: 89 10 mov DWORD PTR [eax],edx
8048428: c9 leave
8048429: c3 ret
0804842a <main>:
804842a: 55 push ebp
804842b: 89 e5 mov ebp,esp
804842d: 83 e4 f0 and esp,0xfffffff0
8048430: 83 ec 20 sub esp,0x20
8048433: c7 44 24 1c 00 00 00 mov DWORD PTR [esp+0x1c],0x0
804843a: 00
804843b: c7 44 24 08 03 00 00 mov DWORD PTR [esp+0x8],0x3
8048442: 00
8048443: c7 44 24 04 02 00 00 mov DWORD PTR [esp+0x4],0x2
804844a: 00
804844b: c7 04 24 01 00 00 00 mov DWORD PTR [esp],0x1
8048452: e8 b5 ff ff ff call 804840c <function>
8048457: c7 44 24 1c 01 00 00 mov DWORD PTR [esp+0x1c],0x1
804845e: 00
804845f: 8b 44 24 1c mov eax,DWORD PTR [esp+0x1c]
8048463: 89 44 24 04 mov DWORD PTR [esp+0x4],eax
8048467: c7 04 24 18 85 04 08 mov DWORD PTR [esp],0x8048518
804846e: e8 7d fe ff ff call 80482f0 <[email protected]>
8048473: c9 leave
8048474: c3 ret
8048475: 66 90 xchg ax,ax
8048477: 66 90 xchg ax,ax
8048479: 66 90 xchg ax,ax
804847b: 66 90 xchg ax,ax
804847d: 66 90 xchg ax,ax
804847f: 90 nop
有兩個問題,我的理解這個:
A)我的第一個問題是找到的字節超限ret
內function
量。再次;我這樣做是通過使用英特爾的語法拆卸和發現:
要在內存中的正確空間ret
需要被設置爲EIP
的函數被調用時設置ret
。 8048412
的地址空間向下移動堆棧0x9
。因爲這是32位的代碼;要到達ret
,我們然後爲字大小增加一個額外的0x4
字節。要得到ret
這意味着ret
設置爲0x9 + 0x4
,它是十進制的13。
這解決了第一個到ret
的問題。
B)第二個問題是跳過0x8048457
內存位置。這通過向(*ret)
添加7個字節來完成,這使得程序跳過並且在0x804845e
處執行,其爲00
(NUL
)。這只是低效的;所以我添加了額外的字節並在堆棧中執行了8個字節;從而導致x = 0
;
我發現字節的確切數量是8(c7 44 24 1c 01 00 00
是7個字節)並且00
是一個字節。這解決了我最後的問題。
我的改性的C代碼:
void function(int a, int b, int c) {
char buffer1[5];
int *ret;
ret = buffer1 + 13; //tried 11, 14, 20, 40, 38, 43
(*ret) += 8; // tried 5, 8, 12; 8 is correct value!
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n", x);
}
由用戶請求移動到StackOverflow的。 (+1,很好的問題。) –
如果你減去地址就像在那篇文章中,你會得到10個字節:)檢查我的答案結束時的鏈接,偏移量是錯誤的。 – iabdalkader
有一個回答說它現在已經被修改了。這是最新的[修訂](https://avicoder.me/2016/02/01/smashsatck-revived/) – NathanOliver