전체 글 289

LOB Level 7 (Darkelf)

orge.c 를 열어보자. 친절하게 //here is changed 라고 써있다. argv[0]의 길이를 검사하는 알고리즘이 적용되어 있음. argv[0]은 다들 알다시피 파일명이 들어가는 자리이다. 우리가 공격을 할때 ./orge [페이로드] 이런식으로 공격을 하니까 일단 저대로 하면 argv[0]은 6바이트가 들어갈 것임. 문제에서는 77바이트를 요구하였으니.. 심볼릭 링크를 이용하여 파일 이름을 75글자로 하면 요구사항에 맞춰질 것이다. [77바이트] = [./] [75바이트 아무문자] argv[2]의 주소를 찾을건데, 저번과 마찬가지로 printf("%x\n",argv[2]); 를 이용하여 찾는다. orge를 복사해서 주소를 찾을 때 복사하는 파일도 똑같이 심볼릭링크를 걸어줘야된다. argv[0]..

LOB Level 6 (Wolfman)

darkelf.c 를 열어보겠음. 아까 level5 소스에서 argv[1]의 길이 체크하는 알고리즘이 추가되었다.. argv[2]에 올리는 공격이 또 먹힐 것 같다 ㅡㅡ; 별로 의미가 없다.. 어차피 원래 쓰던 페이로드가 48바이트 였으니까;; 0xbffe7bc 에 argv[2] 주소가 있는 듯함. argv[2] 주소찾을 때 일단 페이로드 ( argv[2]주소를 몰라도 갯수만 맞춰서)를 인자로 주고 main 아무데나 브레이크포인트를 걸어서 위와 같이 찾아보았다. 아 근데;; 세그먼트 폴트가 일어남; 그래서 그냥 //buffer hunter 위에 printf("%x\n",argv[2]); 를 추가했다. 그리고 나서 돌려봄.. 또 주소차이가 나네. 다시 저 주소로 페이로드를 구성해서 공격해보겠음. ./dar..

LOB Level 5 (Orc)

orc.c를 열어보자. //buffer hunter 까지는 앞에 goblin 문제와 소스가 동일하다. 궁금하다면 goblin 풀이 포스팅을 보시길.. buffer hunter에 대해서 memset(buffer,0,40); 소스가 추가된다. memset함수는 앞전에 설명했듯이 초기화 시키는 것.. buffer의 주소부터 40만큼 0을 채워넣는다는 얘기다. 이전 공격과 마찬가지로.. argv[2]에 셸코드를 넣으면 RET위에 셸코드가 올라가는 것이므로 버퍼가 초기화 되어도 굳이 문제될것이 없다.. 설명안해도 될거라..생각된다. goblin과 똑같다.. 페이로드는 ./wolfman `perl -e 'print "\x90"x44,"\xd0\x75\xfe\xbf"'` `perl -e 'print "\x90"x10..

LOB Level 3 (Cobolt)

먼저 goblin.c 를 열어보자. level2에서는 argv로 인자를 받아 프로그램을 실행하는데, 이건 gets 함수를 이용하여 문자열 입력을 받는다. 뭐..마찬가지로 gets()도 문자열 길이 검사를 하지 않아 오버플로우 취약점이 존재한다. 그럼 뭐부터 해야할 까.. 인자로 받아서 하는 거나 마찬가지다. 입력값을 goblin으로 돌려주면된다. 이미 FTZ Level 12 에서 언급하였다. 일단 RET를 정해줘야 한다. 어디 올릴지 찾아보자. 아.. 버퍼가 16바이트 밖에 안된다. level2에서 했던 방법 처럼 argv[2]에 넣어야 겠다. 페이로드를 구성해보자. [buf]: nop 16 byte [sfp]: nop 4 byte [ret]: argv[2]의 주소 (0xbffffbdf) + nop 10..

반응형