티스토리 뷰

포너블/LOB

LOB goblin풀이

삼전동해커 2020. 8. 24. 22:37

goblin을 풀어보자.



이번엔 egghunter가 존재한다.

환경변수를 못쓰게 되었다.

일단 buffer를 40바이트 할당했고,

int i가 존재한다.


첫번째 if문에서 넘겨주는 값이 2보다 작으면 안된다고 하고,

//egghunter부분에서

for문으로 환경변수의 값을 0으로 memset하고,


if문에서는 두번째로 넘겨주는 인자의 47번째 인덱스,

즉 ./orc `pyhton~~~~ 에서 `python~~이부분의 47번째 인덱스의 값이 /xbf여야 한다.


그리고 strcpy로 입력을 받는다.


문제를 어떻게 풀까..

buffer도 쉘코드를 다 넣을만큼 충분하지 않으니 argv[1]의 자리를 이용하자.

argv[1]는 우리가 작성하는 익스플로잇인 `python ~~`이다.

위치는 문제를 풀면서 확인해보장.



gdb를 확인해보자.


스택을 44만큼 확장했다.



ebp-40이 buffer의 시작위치이다.

44가 왜 아닐까 생각해보니 

i가 존재한다.

buffer선언하고 i선언했으니 i가 buffer보다 위에 있겠다.


그럼 ret는 44에서 시작해 4만큼이겠다.

gdb에서 확인해보자.


먼저 argv[1]을 입력받은 직후에 break를 걸어주자.


그리고 argv[1]을 아래처럼 넣어준다.

\xbf\xbf\xbf\xbf부분은 위에서 if문을 우회하기 위해서이다. 아무튼 \xbf만들어가면 되니까.



그러고 buf에 값이 들어갔는지 확인해보면


우리가 넣은 값이 낮은 곳과 높은 곳 2군데에 존재한다.

뭐지?

왜냐하면 strcpy함수가 argv[1]의 값을 복사해 buffer에 넣어주기 때문에 둘 중하나는 argv이고 다른 하나는 buffer이다.


근데 잘 생각해보면 argv[1]이 더 높은위치에 있다는 걸 알수 있다.

스택에서 더 높은 위치에 있는 argv에 값을 먼저 넣어주고,

그걸 낮은위치에 있는 buf에게 전달한다. 


그러니 argv[1]에 nop sled를 입력한 후 argv[1]의 적당한 위치를 return값으로 전달하면 argv[1]의 위치로 return하겠지?


그럼 다시확인해보자.분명 gdb다시 실행하면 값이 밀린다.





적당히 0xbffffde4로 return하게 하겠다.



이렇게 익스플로잇했다.


스택 채우고,ret에 argv[1]의 위치 넘겨주고 쉘코드까지 흘러갈수 있도록 nop을 조금 채워준뒤 쉘로 마무리.




풀렸따.



'포너블 > LOB' 카테고리의 다른 글

LOB wolfman 풀이  (0) 2020.08.25
LOB orc 풀이  (0) 2020.08.25
LOB cobolt풀이  (0) 2020.08.24
LOB gremlin풀이  (0) 2020.08.24
LOB gate 풀이  (0) 2020.08.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함