시스템 해킹

 1576, 1/79 회원가입  로그인  
   kumi123
   이 어셈코드 설명좀 해주세요./.

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1685 [복사]


.global main
main:
jmp go
func:
pop %ebx ; %ebx에 "/bin/sh" 문자열 시작하는 주소 값 들어감
movl $0x0, %eax
push %eax ; %eax에 0 을 넣은 뒤 스택에 PUSH (str[1]=null 구현)
push %ebx ; 문자열 시작 주소 값 스택에 PUSH (str[0]="/bin/sh" 구현)
movl %esp, %ecx ; %ecx는 문자열 배열의 시작 주소 값 (str 값 구현)
movl $0x0, %edx ; %edx에 null 값
movl $0xb, %eax ; execve의 시스템 콜 번호 11을 %eax에 넣음
int $0x80
go:
call func
.string "/bin/sh"

여기서 call 을하면, ret에 들어간다는 것 까진 알겠는데.. 설명을 보니, ret에 .string이 들어가고 esp도 ret(.string)을 가르킨다고 나오는 군요..
쉽게 설명좀 해주세요

  Hit : 3944     Date : 2013/06/03 10:09



    
Silk ret 은 좀 적절치 않은 단어선택같고,
일단 처음부터 따라가보면 main부터 시작하게 됩니다.

jmp go 네요. 여기서 굳이 jmp go 하는 이유는 call func 가 어셈블리 바이트코드로 바뀌었을 때 00이 들어가는것을 방지하기 위함입니다.
근데 func 함수내의 다른코드들은 00 에 대한 처리를 안하는거보니 큰 의미는 없어보이네요.

func함수가 call보다 위에 있으므로 call 구문은
call옵코드 FF FF FF 37 이런식으로 00이 없는 마이너스 상대주소로 바뀔겁니다.

call 을 하게되면 스택에 eip가 push 되니까 /bin/sh의 주소가 스택에 push된 상태겠구요.

func함수에서 pop ebx함으로써 ebx에 /bin/sh의 주소를 담을 수 있게됩니다.

그 아래는 뭐 시스템콜 인자맞춰주는거니까 크게 어렵지 않구요.
2013/06/06