오늘은 쉘코드에 대해서 작성해보겠다.
쉘코드란
해커가 원하는 작업을 실행시켜주는 코드라고 보면된다.
어셈블리로 작성을하고 아키텍쳐에따라서 코드를 작성해줘야한다.
어셈블리를 알아야한다는 전제하에 진행이 된다.
2017/10/17 - [SYSTEM HACKING/정리자료] - DAY-2 GDB로 어셈블리 해석
윗글을 보고오면 간단한 어셈블리는 해석이 될 것 이다.
#include <stdio.h>
#include <string.h>
char WRITE_ME[256] = "WRITE ME!!!!";
char shellcode[256] = "";
int main(void)
{
read(0,shellcode,256);
(*(void(*)()) shellcode)();
return 0;
}
우리가 이코드로 할 것은 WRITE_ME의 문자열을 쉘코드를 이용해서 변경해서 읽어보는 것 이다.
우리는 read와write을 사용할 것이다.
read에서 eax에는 0x03 ebx에는 fd ecx에는 buf주소 edx에는 버퍼의 크기를 받는다.
write에서 eax에는 0x04 ebx에는 fd ecx에는 buf주소 edx에는 버퍼의 크기를 받는다.
그럼 이를 토대로 어셈블리를 짜보겠다.
xor %eax,%eax //eax초기화
xor %ebx,%ebx //ebx초기화
xor %edx,%edx //edx초기화
mov %0x3,%eax //eax에 3대입
mov %0x0804a040,%ecx //ecx에 WRITE_ME 주소값 대입
mov %0x99,%edx //받을값양
int %0x80 //system콜 호출
(write부분)
xor %eax,%eax //eax초기화
xor %ebx,%ebx //ebx초기화
xor %edx,%edx /edx초기화
mov %0x4,%eax //eax에 4대입
mov %0x1,%ebx //ebx에 1대입
mov %0x0804a040,%ecx //ecx에 WRITE_ME 주소값 대입
mov %0x99,%edx //받을값양
int %0x80 //system콜 호출
이제 이것을 쉘코드로 변환을 해주어야 한다.
https://defuse.ca/online-x86-assembler.htm //레지스터끼리의 연산을 쉘코드로 변환
http://sparksandflames.com/files/x86InstructionChart.html //쉘코드 변환 테이블
https://onlinedisassembler.com/odaweb/ //쉘코드 어셈블리어로 확인 하기
이것을 이용하면 값이 나올 것 이다.
(read부분)
31 c0
31 db
b0 03
b9 40a00408
b2 99
cd 80
(write부분)
31 c0
b0 04
b3 01
b9 40a00408
b2 99
cd 80
이 쉘코드를 이제 코드에 대입해보자!
정말로 read를하고write를 하는 것을 볼 수 있다.
'SYSTEM HACKING > 기법' 카테고리의 다른 글
Special Chapter-RTL Chaining (0) | 2017.11.11 |
---|---|
DAY-6 Return To Library (0) | 2017.11.11 |
DAY-4 프로세스 디버깅 (0) | 2017.11.02 |
DAY-3 버퍼오버플로우를 풀어보자 (0) | 2017.10.23 |
DAY-2 GDB로 어셈블리 해석 (0) | 2017.10.17 |