level 2

2020. 9. 4. 01:34

cobolt.c의 내용입니다.

16바이트의 아기자기한 데이터의 크기를 가지고 있는 buffer친구가 있네요.

 

먼저 저는 두 가지 방법이 떠올랐습니다.

첫째, argv[1]의 주소를 사용해 푼다.

둘째, argv[2]의 주소를 사용해 더욱 깔끔히 푼다.

 

결국 똑같은 소리입니다.

main 함수의 인자를 이용하겠다는거죠.

 

argv[1]을 이용해 먼저 풀어보겠습니다.

 

하기 전에 현재 권한으로 디버깅을 하기 위해 cobolt 실행파일을 원하는 이름으로 복사해놓읍시다.

argv[1] 이용

"A" 문자열 100개를 argv[1] 인자로 던져줍니다.

이후에 디버깅을 통해 strcpy가 실행되기 전의 메모리 값들을 살펴보며 41 문자를 찾습니다.

 

그런데 이상한데에 낑겨있네요 ㅋㅋ

계산하기 싫을 때는 2바이트 앞당겨서 봅시다.

 

0xbffffbea 위치에 있군요.

 

이제 모든 준비가 끝났습니다.

payload를 작성해보겠습니다.

"A"*20(buffer 16바이트 + SFP 4바이트) + "\x06\xfc\xff\xbf"(buffer ~ RET 주소까지의 길이 24바이트. argv[1] 주소에 +24바이트 해야 다음에 오는 NOP Sled 탈 수 있음.) + "\x90"*100 + "~~"(ShellCode)

 

성공했습니다.

 

argv[2] 이용

디버깅을 통해 argv[2]의 주소를 알아냅니다.

 

argv[2]의 주소는 0xbffffbee네요.

payload는 이러합니다.

"A"*20 + "\xee\xfb\xff\xbf", "\x90"*100 + "~~"(ShellCode)

훨씬 간단합니다.

 

성공했습니다.

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

level 6  (0) 2020.09.05
level 5  (0) 2020.09.05
level 4  (0) 2020.09.05
level 3  (0) 2020.09.04
level 1  (0) 2020.09.03

BELATED ARTICLES

more