HO_9
HO9
HO_9
전체 방문자
오늘
어제
  • 분류 전체보기 (104)
    • Write Up (3)
    • WarGame (21)
      • The Lord of Bufferoverflow(.. (7)
      • The Lord of Sql Injection(L.. (1)
      • Pwnable.kr (1)
      • Pwnable.tw (0)
      • XSS GAME (6)
      • Pwnable.xyz (5)
    • SYSTEM HACKING (49)
      • 기법 (24)
      • 문제 풀이 (24)
    • CODING (2)
      • PYTHON (2)
    • WEB HACKING (1)
    • Plan (0)
    • PROJECT (0)
    • iOS (6)
    • ALGORITHM (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

  • .

인기 글

태그

  • log4j
  • 아파치
  • JNDI
  • 취약점

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
HO_9

HO9

DAY-5 쉘코드 작성
SYSTEM HACKING/기법

DAY-5 쉘코드 작성

2017. 11. 10. 22:35
728x90

오늘은 쉘코드에 대해서 작성해보겠다.


쉘코드란 

해커가 원하는 작업을 실행시켜주는 코드라고 보면된다.

어셈블리로 작성을하고 아키텍쳐에따라서 코드를 작성해줘야한다.


어셈블리를 알아야한다는 전제하에 진행이 된다.

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의 문자열을 쉘코드를 이용해서 변경해서 읽어보는 것 이다.

변경하기 위해서 일단 WRITE_ME의 주소와 간단하게 이코드가 무슨 작동을 하는지 알아 보겠다.

gdb로 열어보자



read로 인자를 받아 0x804a160에 저장을 시키고
그값을 실행시켜 주는 코드로 보인다.
그럼 쉘코드를 넣어주면 그코드를 실행킬수 있을 것 같다.

이번엔 WRITE_ME의 주소를 알아보자
nm이라는 명령어를 사용해보겠다.

nm ./sc |grep WRITE_ME이라는 명령어를 입력해 보겠다.
nm은 그프로그램의 함수,변수등의 주소값들을 확인할 수 있다.
명령을 실행시키니 아래와 같은 값이 나왔다.
0804a040 D WRITE_ME
WRITE_ME의 주소값이 0804a040인 것을 알아냈다.

이제 쉘코드를 짜보겠다.

먼저 쉘코드에 나오는 시스템 콜을 알아보자
시스템 콜이란 말그대로 시스템을 부르는 것이다.
시스템을 불러서 함수를 처리해 달라는 기능으로 쓰인다.

그럼 시스템콜 테이블을 확인해 보자.
https://syscalls.kernelgrok.com/
위의 주소로 들어가보면 함수마다의 레지스터의 들어갈 값이 보인다.

우리는 read와write을 사용할 것이다.



read에서 eax에는 0x03 ebx에는 fd  ecx에는 buf주소 edx에는 버퍼의 크기를 받는다.

write에서 eax에는 0x04 ebx에는 fd ecx에는 buf주소 edx에는 버퍼의 크기를 받는다.


그럼 이를 토대로 어셈블리를 짜보겠다.

(read부분)

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
    'SYSTEM HACKING/기법' 카테고리의 다른 글
    • Special Chapter-RTL Chaining
    • DAY-6 Return To Library
    • DAY-4 프로세스 디버깅
    • DAY-3 버퍼오버플로우를 풀어보자
    HO_9
    HO_9

    티스토리툴바