LOB - darkknight -> bugbear

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

Moderator: amesianx

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

LOB - darkknight -> bugbear

Post by KSH » Sat Aug 06, 2016 9:00 pm

bugbear를 잡아보겠습니다.
1.홈디렉터리
1.png
1.png (4.88 KiB) Viewed 479 times
2.소스코드
소스.png
소스.png (10.38 KiB) Viewed 479 times
소스코드를 보면 RTL이라는 힌트가 나와있습니다.
char형의 40byte배열 buffer와 int형 변수 i를 선언합니다.

메인함수의 인자의 수가 2보다 작다면 프로그램을 종료하고
argv[1][47]가 \xbf라면 스택이 당신을 배신했다 라는 문자열과 함께 프로그램을 종료합니다.
이번 문제에서는 리턴주소를 스택에 있는 주소로 변조하는 것이 아니라는 것을 알 수 있습니다.

이 문제는 스택에서 쉘을 실행시킬 수 없으며, 그로인해 환경변수도 사용할 수 없고,
쉘을 실행시켜주는 함수도 없기에 공유라이브러리를 이용해야합니다.

그것이 RTL(Return To Libc)입니다.

3.분석
disas_main.png
disas_main.png (5.11 KiB) Viewed 479 times
이문제도 이전 문제와 마찬가지로 스택에 0x2c(44byte)만큼 할당합니다.
buffer부터 40byte입력후 retrun주소를 변조하면 될 것입니다.

페이로드는 이렇습니다.
buffer(40byte)+SFP(4byte)+system함수의 주소(4byte)+dummy(시스템함수의 return주소 4byte)+"/bin/sh"(4byte)
system함수의 주소 뒤에 dummy가 들어가는 이유는 system함수의 인자는
ebp+8 지점에 있어야 하기 때문입니다.

RTL공격을 하기 위해선 system함수의 주소와 "/bin/sh"의 주소를 알아야합니다.
system.png
system.png (5.12 KiB) Viewed 479 times
system함수의 주소는 0x40058ae0이 나왔습니다.

""/bin/sh"의 주소를 알아내기 위해 프로그램을 작성했습니다.
<"/bin/sh"주소 출력 프로그램 add.c>
add.png
add.png (4.73 KiB) Viewed 479 times
add프로그램은 system함수의 주소값이 들어간 long형의 변수 shell을 선언하고
while문에 memcmp함수를 이용해 shell과 "/bin/sh"의 값을 비교한 후 같지 않다면 1을 리턴하여
while문이 작동하게 되어 shell++을 shell과 "/bin/sh"이 같아질때까지 수행합니다.
shell과 "/bin/sh"의 주소가 같아지게 되면 0을 리턴하여
while문을 종료하고, shell의 값을 출력해주는데, 이것이 "/bin/sh"의 주소입니다.

<add실행>
address.png
address.png (1.87 KiB) Viewed 479 times
0x400fbff9가 나왔습니다.

따라서 페이로드는
buffer(40)+SFP(4)+0x40058ae0(system)+dummy(4)+0x400fbff9가 됩니다. (리틀엔디언으로 작성해야함)

4.공격
attack_success.png
attack_success.png (9.42 KiB) Viewed 479 times
공격에 성공하였고 bugbear의 쉘과 패스워드를 얻었습니다.

Post Reply

Who is online

Users browsing this forum: No registered users and 4 guests