【发布时间】:2026-01-19 17:50:01
【问题描述】:
我得到了写程序的任务。一种从用户那里获取输入,使用一个在堆栈上分配一个字符串的函数,一次写入一个字符,直到它得到一个“Enter”。而另一个程序利用了第一个漏洞,通过堆栈溢出,改变了函数的返回地址,并将其指向恶意代码(我将其写入堆栈)。
我的问题是该函数没有返回到我放入堆栈(在 StackSegment 中)的地址,而是只返回到 CodeSegment 中的地址。 这是获取输入的函数:(printStr 函数从堆栈中打印)
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
【问题讨论】:
-
如果允许修改程序,则可以使用远返回,那么返回地址也将包含该段。
-
要从远程调用返回,请使用远程返回。
标签: assembly stack stack-overflow x86-16