전체 글 292

LOB darkelf -> orge Write up

LOB darkelf -> orge ID : darkelfPasswd : kernel crashed 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령으로 code를 열어봅니다. 추가된 코드의 내용은 파일 경로 + 파일명인 argv[0]의 길이를 체크하는데요.77byte여야 합니다. ./orge 상대 경로로 argv[0]을 넘겨줬을 때 strlen(argv[0])은 6byte일 것이고,/home/darkelf/orge 절대 경로도 77byte는 역부족이네요. 이럴 때 심볼릭 링크를 사용합니다.컴퓨팅에서 심볼릭 링크(symbolic link) 또는 기호화된 링크는 절대 경로 또는 상대 경로의 형태로 된 다른 파일이나 디렉터리에 대한 참조를 포함하고 있는 특별한 종류의 파일이다. (위키백과) ..

System&Write up/LOB 2017.10.09

LOB wolfman -> darkelf Write up

LOB wolfman -> darkelf ID : wolfmanPasswd : love eyuna 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령으로 code를 확인합니다. 추가된 보호 기법이 argv[1]의 길이를 48byte까지로 두는 것입니다. 하지만 goblin부터 argv[1]에는 ‘\bf’ 우회에만 초점을 두고 셸코드는 argv[2]에 넘겨줬었기 때문에 지금까지의 방식으로 풀도록 하겠습니다.goblin Write Up -> https://jaemin8852.tistory.com/40 argv[2]의 시작 주소를 찾기 위해 tmp를 만들고 원본 파일을 tmp에 복사합니다. payload : ./darkelf `python –c ‘print “A”*44 + “\xbf\xbf\xb..

System&Write up/LOB 2017.10.07

LOB orc -> wolfman Write up

LOB orc -> wolfman ID : orcPasswd : cantata 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령어로 code를 확인합니다. buffer 부분을 0으로 초기화 하는 코드가 있지만 goblin에서 buffer를 쓰지 않았기 때문에 argv[2]를 이용해서 payload를 구성하도록 하겠습니다.goblin Write Up -> https://jaemin8852.tistory.com/40 argv[2]의 시작 주소를 찾기 위해 tmp를 만들고 원본 파일을 tmp에 복사합니다. payload : ./wolfman `python –c ‘print “A”*44 + “\xbf\xbf\xbf\xbf"’` `python –c ‘print “\x90”*100 +"\x31\xc..

System&Write up/LOB 2017.10.07

LOB goblin -> orc Write up

LOB goblin -> orc ID : goblinPasswd : hackers proof 접속해서 ls 명령어를 이용해서 파일과 디렉터리를 확인합니다. cat 명령어를 이용해서 code를 확인합니다. egghunter 기법 때문에 우리는 환경 변수를 이용한 공격을 할 수 없게 되었습니다.그리고 무조건 Return Address는 스택 영역으로 변조해야 합니다. 하지만 buffer의 크기는 너무 작아 이용하기 힘들 것 같습니다. argv[1]은 '\xbf' 우회에 초점을 두도록 하겠습니다.그렇다면 환경 변수도 아니고 buffer도 아니고 argv[1]도 아니고 스택에 존재할 수 있는 부분은 뭐가 있을까요? argv[2]입니다. 지금까지는 main 함수 인자를 파일명과 payload 이렇게 두 개만 넣어..

System&Write up/LOB 2017.10.03

LOB cobolt -> goblin Write up

LOB cobolt -> goblin ID : coboltPasswd : hacking exposed 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령을 이용해서 코드를 확인합니다. gremlin에서는 strcpy를 이용해서 buffer에 복사 했다면 cobolt에서는 gets로 입력을 받으니 인자 전달 방식을 다르게 해주면 될 것 같습니다. 환경 변수에 셸코드를 등록해보겠습니다.export SC=$(python –c ‘print “\x90”*13000 + "\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"’) 환경 변수의 주소를 알아내기 위해 코드를 짜고 ..

System&Write up/LOB 2017.10.03

LOB gremlin -> cobolt Write up

LOB gremlin -> cobolt ID : gremlinPasswd : hello bof world 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령으로 코드를 확인해봅시다. 코드를 보면 gate에서는 256byte 였는데 지금은 셸코드도 들어가기 힘든 16byte로 줄었습니다. 환경 변수를 이용하겠습니다. 환경 변수를 만들어 셸코드에 등록하겠습니다.export SC=$(python –c ‘print “\x90”*13000 + "\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"’) 만든 환경 변수의 주소를 알아내기 위해 코드를 짜고 실행해봅시다. 환경 ..

System&Write up/LOB 2017.10.03

LOB gate -> gremlin Write up

LOB gate -> gremlin ID : gatePasswd : gate 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령을 이용해서 코드를 확인합니다. 버퍼에 셸코드를 박고 Return Address를 버퍼의 주소로 변조하겠습니다. tmp 디렉터리를 만들고 gremlin 실행파일을 복사하고 디스어셈블 합시다. 확인해보면 스택프레임을 0x100(십진수로 256)만큼 할당하는게 보입니다. 메모리 구조는 이렇게 될 것 같네요.| buffer(256) | SFP(4) | RET(4) | 그럼 A*256+B*4+C*4를 넣고 버퍼의 주소를 알아보도록 하겠습니다. 확인해보면 버퍼의 시작 주소는 0xbffff908 이겠네요. 256(buffer)+4(SFP) 만큼을 쉘코드와 NOP으로 덮고, R..

System&Write up/LOB 2017.10.03

FTZ level20 -> clear Write up

FTZ 20 Level ID : level20Passwd : we are just regular guys 접속해서 ls 명령으로 파일과 디렉터리를 확인합니다. cat 명령으로 hint를 열어봅니다.fgets에서 크기 제한을 두어 Buffer Overflow는 통하지 않겠네요. printf 함수는 printf(“서식 문자, 문자열”, 인자); 이런 식으로 사용합니다. printf(“%d”, 1); 하면 1이 출력됩니다. ebp+8이 문자열일 것이고, ebp+12가 1일 것입니다.즉, 서식 문자를 넣으면 ‘ebp+값’ 이 점점 커지면서 참조한다는 것입니다. 그렇다면 printf(“%d %d %d”, 1); 이렇게 쓰면 어떨까요?ebp+12까지는 참조가 될 것입니다. 하지만 그 다음부터는 인자가 없어 이상한 ..

System&Write up/FTZ 2017.09.27

FTZ level19 -> level20 Write up

FTZ 19 Level ID : level19Passwd : swimming in pink 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령으로 hint를 열어봤는데 level18과는 다르게 매우 짧은 코드입니다.‘그런데 완전 BOF 기초 문제 아니야?’하고 생각하실 수도 있겠지만,지금까지와 다른 점은 setreuid 함수가 호출되지 않았다는 것입니다. 일단 buf와 SFP 사이에 dummy 값이 있을 수 있으니 디스어셈블 해봅시다. 0x28 십진수로 40 크기의 스택 프레임을 생성합니다. buf가 20byte인 것을 감안하면 dummy 값의 크기는 20byte입니다. | buf(20) | dummy(20) | SFP | RET |이런 메모리 구조를 가지겠네요. 다시 setreuid 함수..

System&Write up/FTZ 2017.09.27

FTZ level18 -> level19 Write up

FTZ 18 Level ID : level18Passwd : why did you do it 접속해서 ls 명령으로 파일과 디렉터리를 확인합니다. 코드를 보면 입력을 받고 x에 하나하나 저장한 후 switch-case문으로 돌리네요.그리고 check의 값이 0xdeadbeef이면 쉘을 실행해줍니다. 그럼 check와 string의 위치를 알아내기 위해 tmp로 옮기고 디스어셈블 해봅시다. 이 부분이 check와 0xdeadbeef 와 비교하는 구문입니다. check는 ebp-104 겠죠. 그럼 string[count] = x; 이 부분을 찾기 위해서 switch-case 부분을 찾겠습니다. 비교와 점프가 밀집해 있습니다. 여기가 switch-case문인 것 같습니다. 그럼 default일 경우 jmp 0..

System&Write up/FTZ 2017.09.27
반응형