level 11

2020. 9. 1. 12:02

실행파일 하나, hint에는 strcpy 함가 눈에 띄네요. 또한, main 함수로 인자가 들어가는군요.

attackme라고 이름이 지어진 것을 보니 이 실행파일의 소스코드인가 봅니다.

 

BOF 취약점이 발생할 수 있는, 입력 값을 검증하지 않는 함수들을 많습니다.

그 중에 하나가 strcpy이죠.

str 변수의 크기를 생각하지 않고 그냥 복사만 수행합니다.

그렇게 되면 ret 주소를 덮을 수 있겠죠.

 

일단 tmp 파일로 복사해서 gdb를 통해 디버깅해보겠습니다.

 

intel을 선호하기에 setting 해주고.

 

이게 이 소스코드의 어셈블리어입니다.

str 변수가 256바이트인 반면, main+3에서 공간 264바이트를 할당하는 것을 보면 8바이트가 dummy인 것을 확인할 수 있습니다.

그러고는 main+48에서 strcpy를 call할 때 위에 보면 인자로 $ebp-0x108의 주소를 가져오는군요.

이제 ret 주소를 변조시킬 수 있을 것 같습니다.

 

256바이트(str) + 8바이트(dummy) + 4바이트(SFP, Saved Frame Pointer) + 4바이트(RET, RETurn adress)

ret을 덮는데 두 가지 방법이 있죠.

첫 번째는 직접 인자로 쉘코드를 전달.

두 번째는 환경변수를 통한 쉘코드 전달.

 

main 함수내에 쉘코드를 던져서 NOP을 통해 내려오게하는 방법도 있지만, ASLR로 인해 main 함수의 시작 주소가 계속 변화하므로 저는 argv[1]의 주소를 알아내 ret에 덮겠습니다.

 

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89
\xe1\x89\xc2\xb0\x0b\xcd\x80

제가 이용할 쉘코드는 위와 같습니다.

exit()가 없는 system("/bin/bash")만 있는 코드입니다.

25바이트입니다.

출처 - https://xerxes-break.tistory.com/212

 

유용한 쉘코드(x86 Shellcode 로컬)

0x01. 가장 기본적으로 쉘을 띄우는 코드 \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80 bytes : 25 미포함 : setreuid(), exit() 0x02. 쉘을 종료할..

xerxes-break.tistory.com

 

argv의 주소를 알아내봅시다.

41414141이 연속으로 들어가있는 부분을 찾으면 되겠죠?

 

찾았네요.

0xbffffad8의 주소를 사용하겠습니다.

어차피 NOP Sled를 탈거니깐요 ^.^

 

성공적으로 쉘을 획득했습니다.

 

환경변수를 이용하는게 안되는데 왜 안되는지 모르겠네요..

나중에 알아봐야겠습니다 ^^

'[▒] 보안 > FTZ' 카테고리의 다른 글

level 13  (0) 2020.09.01
level 12  (0) 2020.09.01
level 10  (0) 2020.08.27
level 9  (0) 2020.08.27
level 8  (0) 2020.08.22

BELATED ARTICLES

more