zj3t

email: euntaejang@gmail.com

Latest Posts
#include <stdlib.h> 

main(int argc, char *argv[])
{
   long i=0x1234567;
   char buf[1024];

   setreuid( 3094, 3094 );
   if(argc > 1)
   strcpy(buf,argv[1]);

   if(i != 0x1234567) {
   printf(" Warnning: Buffer Overflow !!! \n");
   kill(0,11);
   }
}

kill 함수가 모지 라고 생각했지만 프로그램을 이해하기에는 꼭 알고 넘어갈 필요는 없었습니다. 그냥 level11 문제에 i를 변환 시키면 안된다는 것이 추가 됬을 뿐입니다.


일단 이렇게 정리를 할 수가 있겠습니다. gdb어떤 버젼?? 부터 변수가 할당된 후 dummy가 추가 됬다고 합니다. level11 첫 버퍼오버플로우를 설명할 때 설명드렸던거 같아요~~


일단 무조건적으로 일일이 시험을 해봤습니다. 1036에서 변수 i의 값을 침범했습니다. 그럼

 처음부터 변수 i의 거리는 1035일까요?? 아닙니다. 우리는 문자 \x90, 즉 문자열을 일일히

 스택에 덮어씌었었습니다. 그렇다면 NULL문자는?? 문자열의 끝에는 항상 NULL문자열이

붙습니다. 따라서 \x90을 1035개 입력했을 때, 1036번째에는 NULL문자열이 들어가게 됩니

다. 1036개의 \x90을 입력했을 경우에는 1037번째에 NULL문자열이 들어가게 되고, 변수 i

의 영역을 침범했다는 메시지가 뜨게됩니다. 따라서 i까지의 거리는 1036이고 변수 i는 

1037번째 부터 값이 대입되어야 합니다.





level11, level12와 마찬가지로 환경변수에 /bin/sh셸 코드를 넣어 실행하는 방법으로 문제를 풀었습니다. 생략된 부분이 있으면 level11,level12를 보고 오시면 됩니다.

안녕하세요 오랫만의 포스팅인거 같아요~ 그동안 시험기간 때문에 제대로 포스팅을 하지 못했습니다.

오늘도 화이트햇 행사에 참가해서 집에오니 9시라 문제하나만 포스팅 하도록 하겠습니다.

FTZ-level12 문제는 level11문제와 거의 유사합니다. 즉 버퍼오버플로우의 취약점을 이용한 해킹인데 level11에서와 다르게 gets함수로 입력을 받는다는 점입니다.


지금까지와 같은 방식인 hint에 attackme의 코드가 들어있습니다.




이 문제 또한 ASLR이 걸려있습니다. 따라서 level11과 같은 방법으로 풀어야 겠네요...


자 여기까지는 level11과 똑같은 방법입니다. 하지만 level 11에서는 프로그램을 실행할 때 인자를 주어 쉽게 실행할 수 있었습니다. 하지만 이번문제에서는 프로그램을 실행한 뒤 문자를 입력하도록 되어있습니다. ./attackme를 실행한뒤 `python -c 'print " ........"'`를 실행해도 그냥 단순히 변수에 `python -c 'print " ........"'`이란 문자열이 저장 되는 것입니다. 그러면 어떻게 해야할 까요??




바로 파이프라인을 이용하는 것 입니다.

파이프라인은 기호 "|"의 왼쪽 명령의 표준 출력(stdout)을 오른쪽 명령의 표준 입력(stdin)으로 사용됩니다.

예를들어) 명령어A | 명령어B


=명령어 A의 표준출력이 명령어 B에 표준입력으로 된다.

여기서 궁금한 점이 있다. 왜 cat을 붙여야 할까?????

파이프라인 사용시에 왼쪽의 표준 출력이 파이프라인 오른쪽의 표준 입력으로 들어가는데 python이 실행되고 종료되면서 pipe broken오류로 인해 종료가 일어난다. 따라서 사용자의 입력을 출력해주는 cat을 이용해여 stdin을 유지시키는 것이다.

예를 들어) $cat | bash 를 실행하면
cat과 파이프(|)가 동등한 자식프로세스로 연결되면서 cat이 입력 받은 라인이 파이프         를 통해 쉘로 전달되게 된다.

결론적으로 (python -c 'print "........"';cat) | ./attackme에서 괄호를 써주어야 하는 이유는 괄호를 써주지 않으면 python -c 'print "....."'와 cat|./attackme가 따로 실행된다. 따라서 괄호를 사용하는 것이다.
그리고 (python -c 'print "........"';cat) | ./attackme같이 명령어를 입력하게 되면 print사이의 문자열이 출력되고 cat의 입력 대기라인이 같이 attackme에 전달된다 그래서 버퍼오버플로우가 발생하면서 쉘이 실행되는 것이며, 바로 쉘이 종료되는 것이 아닌 사용자입력을 대기하게 되고 이때 우리가 값을 전달하면 쉘에서 그대로 실행이 되는 것이다.














시험기간으로 그동안 포스팅을 못했는데 블로그 접었냐고 쪽지가 몇통 와서요~~

다음주 월요일부터 다시 시스템해킹 FTZ 풀고 리버스엔지니어링 다시 공부한 포스팅 올리

겠습니다~~


















키보드도 눌러보시고 웹언어를 잘못해도 인터넷을 검색해보면 하실 수 있으실 거에요 저도 웹언어는 html만 조금한 정도인데 자세히 보면 충분히 100점짜리는 풀 수 있었습니다.





http://webhacking.kr/challenge/javascript/js1.html
에서 .kr이 17번째 부터 등장하므로 17*30이 답이겠네요~~









역시 100점 짜리 문제는 웹언어를 따로 배우지 않은 저도 풀 수 있을 정도로 쉽습니다.      


index.phps로 들어가보면 이러한 코드가 있습니다.






위의 코드를 이용하여 파이썬으로 코드를 짜면 됩니다.




100점 문제는 왠만하면 풀이를 하지 않을께요 웹언어를 몰라도 기본적으로 언어하나만 배웠으면 풀 수 있을 정도의 수준 입니다.




일단 밑에 사진은 제가 푼 것을 요약한 것을 순서대로 나열한 것입니다. 설명은 밑에서 하겠습니다.







굉장이 짜증나는 문제였습니다. 

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

int main( int argc, char *argv[] )
{
char str[256];

  setreuid( 3092, 3092 );
strcpy( str, argv[1] );
printf( str );

이 코드가 힌트에서 준 attackme코드 입니다. 저 코드를 보고 Shellcode를 이용하여 /bin/bash를 실행해주면 되겠구나 싶었습니다.





여기 까지는 사진을 보고 이해가 가능하실 겁니다. 

즉 우리가 해야할 것은 buffer부터 sfp까지 NOP(0x90)까지 채운뒤 즉 268byte를 채운 뒤 return address를 쉘코드를 실행할 곳으로 바꾸어 주면 됩니다.

<shell code>-25byte(shell을 얻도록 해주는 코드)
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"

그래서 제가 맨첨에 시도한 방법은

243byte-NOP
25byte-shellcode

로 설정한뒤에 return address를 NOP으로 설정한 아무곳의 주소로 설정하는 것입니다.
리버싱에서도 했듯이 NOP은 아무명령도 아니기 때문에 NOP만 실행되다가 결국 shellcode를 만나 실행하게 되는 것입니다.

하지만 여기서 엄청나게 많은 시간을 소모하게 했습니다. 
바로 ASLR이 걸려있었습니다ㅋㅋ 다른 블로그를 보니 예전에는 ASLR이 없던 것 같았는데 지금 제가 풀때는 걸려 있었습니다. 


ASLR은 사진으로 확인할 수 있습니다.

그래서 생각한 방법이 RTL기법 입니다. (Return to lib) 
말 그대로, 리턴 값을 라이브러리가 있는 곳으로 바꿔버린다는 것입니다.

하지만 RTL을 사용하기에는 제가 systemhacking을 많이 공부한게 아니여서 잘 모르고 RTL에 모티브를 얻은 것이 환경변수를 이용한 것이였습니다.

저는 환경변수를 하나 만들어 그곳에 shellcode를 넣었고 환경변수의 주소를 알려주는 getenv함수를 이용하여 환경변수의 주소가 바뀌는지 확인하였습니다. 다행이 바뀌지 않는 것을 확인 할 수 있었습니다.



이렇게 해서 리턴어드레스를 환경변수의 주소로 설정해주어 level12의 쉘을 얻을 수 있었습니다.



RTL기법으로 푼 다른 분이 있어서 URL 첨부하겠습니다.