딩굴댕굴

[Hackerschool FTZ] OPCODE 만들기 - shellcode

by jennysgap

BOX


[Hackerschool FTZ] OPCODE 만들기 - shellcode


아주 간단하게 작성한 쉘 실행코드

execve( [실행할 명령] , [실행할 명령의 주소번지 값] , NULL );


우리는 이 코드에서 필요한 값들만 간추려서 OPCODE를 만들어 내는 것이 이번 강의의 목적이다.

우리가 execve( [실행할 명령] , [실행할 명령의 주소번지 값] , NULL ); 코드 동작에 원리를 이해하기 위해서는 정적으로 컴파일하여 열람할 예정


# gcc -static -g -o sh01 sh01.c

# objdump -d sh | grep \<main\>: -A 18


execve( [실행할 명령] , [실행할 명령의 주소번지 값] , NULL );

push 순서는 거꾸로[←] 진행된다. 

- 처음에 NULL값 넣기

- ebp에서 8번째에 있는 값(=/bin/sh 주소번지 값)을 %eax에 복사

- 문자열 명령어 자체를 push 해준다.


# objdump -d sh01 | grep \<__execve\>: -A 32


명령어 instruction에서 몇 번째 값을 호출할 것인가? $0xb 11번


/usr/include/asm/unistd.h 에서 (시스템함수 콜 번호) 11번 값을 확인해보면 

execve로 명령어가 정의되어있는 것을 알 수 있다. 


다시 메인 코드로 돌아가서 

컴퓨터에는 음수가 없기때문에 보수로 표현한다. 

0xfffffff8은 보수로 표현한 값이다. 즉, -8이라는 의미다.

0xfffffffc는 -4를 의미함.



각 레지스트리에 인자값을 차례대로 넣고 결과적으로 eax 11 명령어를 실행하는구나!

결국 이 문제를 풀기위해서는 edi, ecx, edx, eax 안에 어떤 값이 들어있는지만 알면 된다.






위 내용들을 기반으로 어셈코드를 작성해보도록 하겠습니다.

%esp는 현재의 스택의 위치 = /bin 시작점 즉, / 의 시작점을 의미한다.

/bin의 / 시작점을 %ebx에 넣어준다.



위 내용을 그대로 c코드로 작성해 본다.



이것을 이제 쉘코드로 뽑아야 한다.

# objdump -d sh02 | grep \<main\>: -A 20


여기에는 0이 너무 많이 포함되어 있는 문제가 있다.

(0을 만나게 되면 끝인줄 알고 동작을 안하는 문제가 생긴다.)

그래서 00은 없애줘야 하므로 코드 변경이 필요하다.


xor 연산자를 이용하면 00을 변경할 수 있다.

xor 연산자는 같은 값으로 연산하면 결과는 무조건 0으로 나온다.

mov %esp, %ebx    --> /bin//sh 문자열 자체를 가리키고 있음 (즉, %ebx는 문자열값)

...

push %ebx     --> 여기에 %ebx 값을 넣음

mov %esp, %ecx     --> %esp의 값은 %ebx를 가리키고 있는 값이 됨 (즉, %ebx는 /bin//sh 주소값의 주소값이 됨)

...

$al 은 8비트임. 11을 8비트로 처리하면 0이 발생하지 않게 된다.




다시 쉘을 뽑아보면

# objdump -d sh03 | grep \<main\>: -A 20


보라색 네모 박스 안에 있던 00이 다 사라졌음을 알 수 있다.






반응형

블로그의 정보

jennysgap

jennysgap

활동하기