cgy12306
[LOB] succubus 본문
ID : succubus
PW : here to stay
문제 힌트는 PLT라고 나와 있다.
plt는 외부 프로시저를 연결해주는 테이블이다. plt를 통해 다른 라이브러리에 있는 프로시저를 호출해 사용할 수 있다.
소스코드를 보면 strcpy의 주소를 buffer의 45번째부터 4byte를 비교해서 아니면 종료시키고, 맞으면 strcpy함수와 printf함수를 실행시킨 후 buffer의 49번째부터 4byte를 A로 바꾼다. 즉, strcpy 함수로 ret의 주소를 strcpy의 plt로 바꿔서 main함수가 끝난후에 strcpy함수를 다시 실행 해도 strcpy의 return address를 AAAA로 덮어지기 때문에 Segmentation fault가 뜨게 된다.
우선 strcpy의 주소를 알아보자.
0x08048410이다.
첫번째 분기문은 잘 우회했지만 Segmentation fault가 떴다.
return address를 strcpy를 호출하는 주소로 넣었으니 우리는 strcpy 함수의 인자가 어떻게 들어가는지 알아야 한다.
char * stcpy( char * dest, const char * src)
첫번째 인자는 도착지 주소가 들어가고 두번째 인자는 출발지 주소가 들어간다.
시나리오를 짜보면 A를 44개 넣고, return address에 strcpy의 주소를 넣어준다. 그 다음 return address를 다시 넣어줘야 하지만 memset으로 인해 AAAA로 덮이기 때문에 dummy값을 넣어주고, 차례대로 버퍼의 dest주소, src 주소를 넣어준다. 이 후 쉘코드가 들어있는 주소를 넣어준다. 이렇게 되면 main 함수 종료 후 strcpy가 실행되고 return address는 AAAA로 덮여있겠지만, 호출한 strcpy함수로 AAAA가 들어가 있는 곳에 값을 쉘코드가 들어있는 주소로 덮이게 되어 해당 주소를 실행하게 될 것이다.
페이로드를 구성해보자.
./nightmare `python -c 'print "A"*44 + "strcpy 주소" + "dummy(return address, A로 덮어짐)" + "도착지 주소" + "출발지 주소" + "쉘코드 주소"'`가 된다.
dest 주소와 src 주소를 알기 위해 다음과 같이 작성해보자.
./nightmare `python -c 'print "A"*44 + "\x10\x84\x04\x08" + "AAAA" + "BBBB" + "CCCC" + "DDDD" + "EEEE" + "FFFF" '`
0x41414141이 두개 들어가 있다. 하지만 상관 없다. 우리는 어느 부분의 값이 변조되는지 알기 때문이다.
여기서 주의 할 점은 입력해 주는 값에 따라 버퍼의 주소도 변할 수 있기 때문에 필요한 값만 넣어서 주소를 고정시켜주는 것이 좋다.
쉘코드 주소를 알아보자.
./nightmare "`python -c 'print "A"*44 + "\x10\x84\x04\x08" + "\x90\x90\x90\x90" + "\x20\xfa\xff\xbf" + "\x2c\xfa\xff\xbf" + "\xc3\xfe\xff\xbf"'`"
'Wargame > LOB' 카테고리의 다른 글
[LOB] xavius (0) | 2019.09.30 |
---|---|
[LOB] nightmare (0) | 2019.09.30 |
[LOB] zombie_assassin (0) | 2019.09.30 |
[LOB] assassin (0) | 2019.09.30 |
[LOB] giant (0) | 2019.09.30 |
Comments