LOB - giant -> assassin

해킹대회 문제 풀이 연습장소

Moderator: amesianx

Post Reply
KSH
Posts: 24
Joined: Thu Jul 21, 2016 5:39 pm

LOB - giant -> assassin

Post by KSH » Mon Aug 08, 2016 10:40 pm

거인을 잡아봅시다.
1.홈 디렉터리
1.png
1.png (4.2 KiB) Viewed 454 times
2.소스코드
2.소스.png
2.소스.png (12.97 KiB) Viewed 454 times
이 프로그램은 메인함수에서 인자를 받습니다.(argv[])
40byte의 char형 배열 buffer를 선언합니다.

인자수가 2개보다 적다면 argv error라는 메시지와 함께 프로그램을 종료합니다.
argv[1][47]의 값이 \xbf이거나, \x40일때도 종료합니다.
조건을 전부 통과했다면 argv[1]의 내용을 buffer에 복사한 이후 출력합니다.
그리고 memset함수가 buffer배열부터 44바이트(buffer+sfp)만큼 0으로 만들어버립니다.

이 문제의 힌트를 보면 No RTL이라고 적혀있습니다.
소스코드를 보면 리턴주소가 \xbf 또는 \x40일 경우 종료되는 것으로 작성되어 있습니다.
그래서 RTL이나 스택을 이용한 공격이 불가능해보이지만 가능합니다.

<분석> (peda는 LOB를 마친 이후에 사용하겠습니다.)
3.disas_main1.png
3.disas_main1.png (24.69 KiB) Viewed 454 times
4.disas_main2.png
4.disas_main2.png (22.2 KiB) Viewed 454 times
main+3부분을 보면 스택에0x28(40)byte만큼의 공간을 할당합니다.
따라서 스택의 구조는 buffer(40) + SFP(40) + RET(4)가 됩니다.

이 문제에서 중요한 부분은 main+173부분에 있습니다.
leave는 mov esp ebp와 pop ebp로 이루어져 있습니다 (intel문법)
ret은 pop eip와 jmp eip로 구성되어 있습니다.

leave는 esp를 ebp와 같게만든 후에 ebp를 pop합니다.
ret은 leave를 실행하기 이전 ebp+4를 참조한 주소를 실행합니다.
리턴주소에 ret의 주소를 넣는다면 프로그램을 끝내면서 ret을 한번 더 수행합니다.
그렇게되면 esp는 한번더 증가하게되고 증가한 esp의 주소의 명령을 실행합니다.
즉, ret이 4byte만큼 밀리게 되는 것입니다.

이것을 retsled이라고도 합니다.이것을 이용하면 프로그램의 if문의 조건을 충족시키면서, 리턴주소에 \xbf또는 \x40을 입력할 수 있게 됩니다.
프로그램을 마치는 시점에서 ret을 수행하게 되면 eip에 있는 명령을 실행시키기 때문입니다.
이제 RTL을 시전할겁니다. 그러기 위해선 ret명령의 주소와 system함수의 주소, /bin/sh의 주소등의 준비물이 필요합니다.

<ret>
ret_addr.png
ret_addr.png (2.62 KiB) Viewed 454 times
ret : 0x0804851e

<system>
system_addr.png
system_addr.png (4.96 KiB) Viewed 454 times
system : 0x40058ae0

</bin/sh>
bin_sh_addr.png
bin_sh_addr.png (8.06 KiB) Viewed 454 times
/bin/sh : 0x400fbff9

준비물을 전부 모았습니다. 이것으로 페이로드는 이렇게 됩니다.
| buffer+SFP(44byte) | + | ret(0x0804851e) | + | system | + | system의 리턴(dummy) | + | /bin/sh |

4.공격
이번에는 이전과는 좀 다르게 파이썬으로 익스플로잇 코드를 만들었습니다.
exploit.png
exploit.png (10.91 KiB) Viewed 454 times
마지막으로 exploit.py를 실행시켰습니다.
attack.png
attack.png (6.71 KiB) Viewed 454 times
assassin의 쉘과 패스워드를 얻었습니다.

익스플로잇 코드를 사용하면 for문을 사용하여 brute force같은 대입공격을 하여
수월한 공격을 할 수 있다는 것을 알았습니다.

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest