레드헷 6.2 - 더미 값 없음 보호 기법 적용 없음 bash2 사용해야함

1 - gate

버퍼가 256이 할당 되어있고 단순히 strcpy -> printf 로 전달
버퍼 내에 쉘코드를 넣어준뒤 ret 주소에 버퍼의 주소를 넣어 쉘코드를 실행시킴

2 - gremlin

버퍼가 16이 할당됨 argv[2]에는 제한이 존재하지 않은것을 이용해서
argv[2]에 쉘코드를 넣어 준 뒤 argv[1]의 리턴 주소를 argv[2]의 주소로 바꾼다 

3 - cobolt

gets 함수 취약점[엔터를 누를떄가지 문자열로 입력을 받아들여서 버퍼 오버플로우 발생 ]을 이용해서 푼다 
파이프 함수와 캣을 이용해서 buf[16]만큼 할당 된곳에 
sfp값까지 총 20을 넣어 20+ ret +쉘코드 로 페이로드를 짜서 ret주소를 쉘코드 주소로 바꿔서 공격한다 

4 - goblin

buf [40] 이 주어져있다 egghunter로 인해 환경변수 와 에그쉘이 막혀있는 상황
argv[1][47]은 \xbf를 만족해야함 

5 - wolfman

버퍼 40 이 주어졌고 buffer hunter로 0~40까지 다 막아버린다 
argv[2]에 놉코드와 쉘을 배치하여서 argv[1]에 ret부분에 놉코드의 주소를 써서 풀었다

6 - darkelf

argv[1]에 제한 조건이 걸려있음 argv[2]에 쉘코드와 놉코드를 넣고 argv[1] 리턴 주소에 놉코드의 주소를 돌려 주면 됨 

7 - orge

argv[0]의 길이가 77이 아니면 종료가됨 
./ < 의 크기도 고려를 해줘서 공격할 프로그램을 77길이에 맞춰서 
.////~~~공격 `pythonc 식으로 페이로드를 짜면 된다 

8 - troll

심볼릭 링크

argv[1]을 다 초기화 해버린다 \x2f가 존재하는 쉘코드면 심볼릭링크 파일로 만들 수 없으므로 \x2f가 존재하지 않는 쉘코드를 이용해서 풀어야함
자동완성 기능을 위해서 AABB를 넣고 쉘코드를 넣은 뒤 심볼릭링크 파일로 만들어서 풀었음

9 - vampire

argv[1][46] == '\xff' 일시 종료됨
그러나 argv[2]에 한도 값이 없으므로 놉코드를 많이 넣어줘서 낮은 주소로 점점 이동시켜서 \xff의 영역을 벗어난곳에 쉘코드를 집어 넣는다 

10 - skeleton

ultra argv hunter 라는 것이 새로 생기고 
argv를 전부 사용하지 못합니다 
하지만 스택을 일일히 보다보면 초기화되지 않은 argv[0]이 존재합니다

NULL위에 있는 program name은 초기화 되지 않음
심볼릭 링크를 만들어준 후에 AABB(자동 완성을 위해서)길이까지 총
./AABB = 6 을 생각해서 &(program name)+6 만큼 주소를 높게 해서 
ret에 넣어준뒤 주소 끝 값에 닿지 않도록 놉을 뒤에 추가로 줬다.
그 뒤에 argv[1]의 조건을 만족 시키기 위해서 [1][47]!=\xbf를 넣어줘서 공격한다.

11 - golem

stack destroyer가 추가됨 버퍼부터 메모리 끝 영역까지 초기화를 해서 
메모리 마지막 영역을 사용 할 수가 없게됨

0xff                                    ~                                      0x00
커널 | argv | argc | ret | ebp | buf | 공유라이브러리 | heap | data | code
      |---------  stack ----------------|

메모리 구조는 이러한 식으로 되어있고 버퍼부터 argv까지 쭉 초기화 되어있기 떄문에 공유 라이브러리를 이용해야 한다 .
gcc -fPIC -shared [돌아가기만 하는 프로그램] -o `~쉘코드~'` 이러한 식으로 
공유라이브러리에 올려줄 수 있고 ret에 적당한 공유라이브러리 주소를 넣으면 공격된다 [ 공부하다가 알아낸것 : 공유 라이브러리를 이용하면 1~20까지 모든 권한을 습득 가능했다]

12 - darkknight

SFO (Frame Pointer Overflow)를 이용해서 풀었음
변조한 ebp값이 sub()에서 mov esp,ebp를 통해 esp에 저장된다
그후 pop ebp를 해서 +4가 증가되고
esp의 위치도 +4가 된다 ret를 수행하면서 eip로 전달되서 초기 변조된 sfp값의 주소가 시작된다 
고로 쉘코드를 기존 sfp(변조 시킨 값)+4에 넣어주면 된다

13 - bugbear

argv[1][47] == '\xbf' 를 만족해야하는데 스택을 사용할 수 없으므로
RTL을 사용해야한다

14 - giant

execve를 리턴주소에 넣어야함 (ret =exever adr과 같은 조건이 있음)
execve (const char *filename, char *const argv[], char *const envp[]) < 형태
첫번째 인자 : 실행시킬 파일명 두번째 인자 : 전달할 인자값 세번쨰인자 :환경변수
고로 ret주소 뒤에 system+exit+bin/sh+null을 넣어줘야함 null은 스택 끝쪽에 아무거나 비어잇는거 사용함
여기서 0a는 줄바꿈을 시도하는 어셈블리기 때문에 문자열 "~"로 전달하여야함

15 - assassin

RTL과 스택 주소 이용 불가
RET은 pop eip jmp eip를 수행 만약 ret 주소에 ret이 들어가잇으면
렛을 다시 수행하면서 추가로 +4가 주어짐
렛 주소를 한번 더 쓴뒤 RTL을 하면 됨

16 - zombie_assassin

fake ebp

17 - succbus

함수연속호출(?) 이던가 도개걸윷모 ret주소 이용햇던거마냥 계속 호출하고 마지막에 쉘코드 써주고 쉘코드 주소를 넣어주면 됨

18 - nightmare
argv의 ret이 strcpy와 같아야하고 buf48에서 +4 주소를 A로 채워버림
strcpy(a,b)는 b의값이 a로 전달 되는 함수이다 

&SYSTEM+A*4+&/bin/sh+A*32+&STRELN+"A"*4+&RET+&BUF의 첫 주소로 공격
을 해서 클리어했다

19 - xavius

buffer[47] == \xbf 일 경우 exit(0) buffer[47] == '\x08' 일 경우 exit(0)
while(memcmp(ret_Addr, "\x90\x90", 2) != 0)
{
   if (*ret_addr == '\xc9){ //leave
     if(*(ret_addr+1) == '\xc3\)} //이쪽 부분들 포인터 변수인 ret_addr을 통해서 라이브러리를 사용하지 못하게만들었고 라이브러리 끝에도 leave,ret이 존재하기 때문에 철저하게 막아놓은것

버퍼에 값을 fgets(buffer , 256, stdin)
                  print("%s\n", buffer) 이런식으로 전달을 하는데 stdin에는 일시적으로 값을 저장하기위한 임시 입력 버퍼이고 stdin의 주소에는 전송한 값이 잇기에 
stdin의 초기주소를 구해서 풀었다.

20 - deathknight

리모트공격 문제 기존의 쉘코드를 같은 로컬일때나 가능하고 
지금 같이 통신을 통한 공격은 사용이 불가능하기에 바인드쉘코드를 직접 넣음
소스를 넣은뒤 6666포트로 공격을하고 0xbffffff주소 부터 놉코드만큼 줄여나가서 공격을 하도록 소스를 짠뒤 연결에 성공하게 되면 Escape character is '^]'.가 나오는데 세미콜론을 붙여서 명령어를 치면 받아들인다


 

'해커스쿨 lob' 카테고리의 다른 글

LOB CLEAR~  (0) 2016.05.21
LOB death_knight  (0) 2016.05.21
LOB xavius  (0) 2016.05.19
LOB nightmare  (0) 2016.05.19
LOB succbus  (0) 2016.05.16

+ Recent posts