[Hackerschool FTZ] OPCODE 만들기 - shellcode
by jennysgap[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이 다 사라졌음을 알 수 있다.
'BOX' 카테고리의 다른 글
[Hackerschool FTZ] level 20 - Fomat String Buffer Overflow (0) | 2019.06.20 |
---|---|
[Hackerschool FTZ] OPCODE 만들기 - Setreuid (0) | 2019.06.20 |
[Hackerschool FTZ] level 19 - Setreuid Shellcode (0) | 2019.06.20 |
[Hackerschool FTZ] level 18 - Pointer (0) | 2019.06.20 |
보안회사 블로그 or Reading Materials (0) | 2018.12.20 |
블로그의 정보
jennysgap
jennysgap