darkelf의 소스입니다
저번 문제에 비해서 추가된것은 
if(strlen(argv[1]) > 48 ) {
printf ("argument is too long!.\n");
exit(0);
}
이거 밖에 없군요 . 음....argv[1]에 조건이 걸려있는걸 보아하니 
argv[2]를 통해 공격하던식으로 또 공격하면 풀릴거같습니다 
제가 시스템에 관하여 초보이기 때문에 너무 날로먹는 치사한 방법을 사용하는것인가 싶기도 하네요...-_-;;


새로 추가된 친구들입니다 .
ebp+12  = argv[0]에 4만큼 공간을 먹게만들어서 argv[1]로 만드네요
그 후에 edx에 넣고 strlen함수를 호출합니다.
+195에서 eax와 48을 비교합니다 지금 eax에는 argv[1]이 담겨잇겠지요
198에서 작거나 같으면 main+224에 보내는군요 그렇지않으면 프로그램이 종료 되버립니다.

뭔가 너무 날먹는거같지만 아까와 똑같이 진행을 해보겠습니다.


"A"*47과 \xbf의 값이 보입니다


"B"의 값들이 보입니다 .
저번과 마찬가지로 공격코드를 짜보겠습니다.

공격에 성공했습니다. 근데 개인적으로 너무 날로먹는거같아서 추가로 gdb분석을 해볼까합니다 .


새로 생긴 main +174쯤에 브레이크포인트를 걸어주겠습니다


에러가 나네요 브포를 잘못 잡앗나봅니다..

그렇다면 main +176으로 잡아보겠습니다


되네요 하하 한번에 잡을수 있도록 더 연습을 해야겠습니다.


eip로부터 두개의 어셈코드를 뽑아냈습니다. 두번 다음 어셈으로 넘어가도 eax값은 변함없이 0xbffffae8이군요 


0xbffffbec를 가리키고있습니다.

쫄래쫄래 따라가보니 아까 argv[1]에 입력한 값이 나오네요 

제가 지금 알고싶은것은 

if(strlen(argv[1]) > 48 ) {
printf ("argument is too long!.\n");
exit(0);}
여기서 48을 초과하면 어떻게 되느냐 정확히는 저렇게 argv[1][2]의 값을 넣어줫는데 strlen부분에서는 정확히 어떠한식으로 반응할까? 이것을 gdb로 보고싶습니다

바로 프린트까지 이동을 해보겠습니다


48만큼 정상적으로 받아들이네요


이번엔 값을 초과하면 어떻게 보나 알기 위해서 48을 초과한 58을 넣어보겠습니다

58만큼 값이 그대로 나오네요 


0x80485cd 즉 printf문에서 한번 더 출력하니 argument is too long이라는 문구가 출력되는걸 볼 수 있습니다! 
뭔가 gdb랑 더 가까워진 기분이네요 음음 
오늘 연습한 분석방법을 이용해서 다음에 더 유용하게 문제풀이를 할 수 잇었으면 좋겠습니다!

'해커스쿨 lob' 카테고리의 다른 글

LOB troll  (0) 2016.05.04
LOB orge  (0) 2016.05.02
LOB wolfman  (0) 2016.05.02
LOB goblin  (0) 2016.05.01
LOB cobolt  (0) 2016.04.30

+ Recent posts