코드를 보니 RET 제외한 스택을 전부 0으로 초기화 시킨다.

아무리 봐도 모르겠어서 예전에도 한번 여기서 막혀서  일단 다른사람이 어떻게 풀었는지 참조하면서 공부했다.

찾아보니 LD_PRELOAD 라는 것을 사용해서 푸는 것이라고 한다.

LD_PRELOAD는 dynamic linker 가 해당 경로의 so 파일을 공유 라이브러리로 무조건 선적재함.

라고 정의 되어있지만, 간단히 말해 프로그램이 시작될때 참조하는 것이라고 기억해두었다.

다음과 같은 코드를 짠 후

* stdio.h를 포함하지 말아야한다.

컴파일 옵션을 저렇게 주고, LD_PRELOAD를 등록 시킨 후

실행 시키면 놀랍게도 이렇게 쉘이 따인다.

그대로 golem에 적용시켜보려고 했더니 이렇게 먹히질 않는다.

아마도 실행되는 권한이 바뀌면서 LD_PRELOAD가 먹히지 않는 것이라고 생각하였다

혹시나 하고 다른 여러가지 실험을 해보았다.

먼저 /bin/my-pass의 권한에 setuid 비트가 걸려있는지 확인을 해보았다.

걸려있지 않았다 my-pass는 geteuid를 호출할때 setuid비트가 걸린 계정의 암호를 보여주기 때문에 setuid비트를 걸지 못한다.

이렇게 훨씬 상위의 비밀번호도 알아낼수 있었다.

일단 이렇게 아무동작도 안하는 프로그램을 하나 생성해서 이름을 쉘코드로 만들어 컴파일 해준다.

'IT > LOB' 카테고리의 다른 글

[LOB] vampire  (0) 2016.07.23
[LOB] troll  (0) 2016.07.17
[LOB] orge  (0) 2016.07.17
[LOB] darkelf  (0) 2016.07.17
[LOB] wolfman  (0) 2016.07.17

코드를 보면 ultra argv hunter 라고 argv를 모두 초기화 시키는 부분이 추가되었다.

처음에는 어떻게 할지 모르겠어서 일단 코드를 보고 심볼릭링크가 필요하다는 것을 알았다.

gdb 권한문제 때매 파일 명 길이가 같은 새 파일에 복사 후 심볼릭 링크를 걸어주었다.

쉘코드는 이것을 사용하였다.

\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3

구글링을 통해 스택 레이아웃을 다시 한번 살펴보았다.

https://www.win.tue.nl/~aeb/linux/hh/stack-layout.html

마지막 부분에 program name이 남는 것을 볼 수 있었다.

혹시나 해서 한번 시도해보았다.


정말로 마지막 부분에 프로그램 이름이 남아있었다. 

그래서 이부분에서 nop 주소중 하나를 골라서 ret에 덮었더니 성공하였다.

Flag : shellcoder


'IT > LOB' 카테고리의 다른 글

[LOB] skeleton  (0) 2016.07.24
[LOB] troll  (0) 2016.07.17
[LOB] orge  (0) 2016.07.17
[LOB] darkelf  (0) 2016.07.17
[LOB] wolfman  (0) 2016.07.17

소스가 많이 줄어들었다.

이번에는 \xff를 필터링 하고 있다.

 | argv[2] | argv[1] | argv[0] |

-->>> 

스택의 진행 방향이다.

argv[2]의 크기가 커질 수록 argv[1]는 더 낮은 주소에서 시작되게 된다.    

이렇게 3번쨰 인자값을 늘리면서 0xbffff 가 아닌 주소값을 찾아내었다.

Flag : music world


'IT > LOB' 카테고리의 다른 글

[LOB] skeleton  (0) 2016.07.24
[LOB] vampire  (0) 2016.07.23
[LOB] orge  (0) 2016.07.17
[LOB] darkelf  (0) 2016.07.17
[LOB] wolfman  (0) 2016.07.17

코드를 보면 argv[0]을 초기화 시키는 구문이 사라지고, argv[1]을 초기화 시키고 있다.

따라서 argv[0]을 이용하여 문제를 풀어야한다.

이렇게 코드를 만들고, argv[0]의 주소를 구한다.

argv[0]에 쉘코드를 넣어야 하는데, 어떻게 넣어야 할까 하다 이름 자체를 변경하여 넣기로 하였다.

하지만 쉘코드 중간에는 "\x2f" 라는 부분이 있는데 이 부분은 디렉토리를 구분해주는 인자이기 때문에 계속 오류가 떴다.


그래서 다음과 같은 쉘코드를 사용하였다.

\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81


이렇게 복사후

쉘을 땄다.

Flag : aspirin

'IT > LOB' 카테고리의 다른 글

[LOB] vampire  (0) 2016.07.23
[LOB] troll  (0) 2016.07.17
[LOB] darkelf  (0) 2016.07.17
[LOB] wolfman  (0) 2016.07.17
[LOB] orc  (0) 2016.07.17

argv[0]을 77자로 체크하는 구문이 추가되었다. 따라서 심볼릭 링크로 파일명을 바꿔준 후 실행하는 방법을 쓴다.

다음과 같이 코드를 짜고 

심볼릭링크를 걸어준다.


주소를 따준 후에

실행 해준다.

전 단계와 같은 방법으로 하되, argv[0]의 값만 신경써주면 된다

Flag : timewalker

'IT > LOB' 카테고리의 다른 글

[LOB] troll  (0) 2016.07.17
[LOB] orge  (0) 2016.07.17
[LOB] wolfman  (0) 2016.07.17
[LOB] orc  (0) 2016.07.17
[LOB] goblin  (0) 2016.07.17

코드를 보니 argu의 길이를 확인하는 구문이 새로 생겼다.

buffer 주소값과 argv의 주소값을 찾도록 복붙하였다.

주소값을 구했다.

처음 두번과 같이 argument를 제약한다.

buffer(40) + sfp(4) + ret(4)  이므로 딱 48바이트가 된다. 있으나마나 한 제약이라

 전 단계의 페이로드를 그대로 쓰면 된다.


Flag : kernel crashed

'IT > LOB' 카테고리의 다른 글

[LOB] orge  (0) 2016.07.17
[LOB] darkelf  (0) 2016.07.17
[LOB] orc  (0) 2016.07.17
[LOB] goblin  (0) 2016.07.17
[LOB] cobolt  (0) 2016.07.12

코드를 보면 전레벨과 동일하지만, 마지막에 buffer hunter라는 구문이 추가되었다.

argv[1]의 주소에도 인자가 쓰여져 있으므로 argv[1]의 주소를 덮으면 된다.

근데 실수로 버퍼를 이용해서 풀어버렸다.

왜 버퍼헌터가 작동 되지않은것은 잘 모르겠다.

이렇게 argv[1]의 주소를구해 덮는 방법도 있다.

Flag : love eyuna

'IT > LOB' 카테고리의 다른 글

[LOB] darkelf  (0) 2016.07.17
[LOB] wolfman  (0) 2016.07.17
[LOB] goblin  (0) 2016.07.17
[LOB] cobolt  (0) 2016.07.12
[LOB] gremlin  (0) 2016.07.12


코드를 보면 조건이 꽤 많다.

egghunter라는 것이 있어 환경변수 사용을 막고,

argv[1][47]의 값이 \xbf가 아니라면 종료시킨다.

권한 문제로 인해서 새로운 c파일을 만들어 gdb로 까보았다.

i와 배열 총 44바이트를 주고있다. 따라서 dummy는 없다고 볼 수 있고,

| i(4) | buffer(40) | sfp(4) | ret(4) |

가 된다고 볼 수있다.

버퍼의 주소를 알기 위해서 코드 한줄을 추가후 실행시켜 보니 

0xbffffae0 이라는 주소가 나왔다.

그러므로 ./orc `python -c 'print "A"*44+"\xe0\xfa\xff\xbf" + "\x90"*200+"SHELLCODE"'`

의 형식으로 짤 수있다.



Flag : cantata

'IT > LOB' 카테고리의 다른 글

[LOB] wolfman  (0) 2016.07.17
[LOB] orc  (0) 2016.07.17
[LOB] cobolt  (0) 2016.07.12
[LOB] gremlin  (0) 2016.07.12
[LOB] gate  (0) 2016.07.11

gremlin과 비슷한 문제이다

대신 gets함수로 인자값이 아닌 프로그램상에서 입력을 받고 있다.

gremlin과 똑같이 주소값을 구하지만 값을 전달하는 방식이 틀리기 때문에

아래의 방법으로 구문을 짜면 된다.

(python -c 'print ~~~~~~~~~~~~';cat) | ./goblin

Flag : hackers proof

'IT > LOB' 카테고리의 다른 글

[LOB] wolfman  (0) 2016.07.17
[LOB] orc  (0) 2016.07.17
[LOB] goblin  (0) 2016.07.17
[LOB] gremlin  (0) 2016.07.12
[LOB] gate  (0) 2016.07.11

코드를 보면 버퍼의 크기가 작아졌다. 따라서 25바이트 쉘코드를 그대로 때려넣는 방법은 사용하지 못한다.

그래서 이런 문제들은 환경변수를 사용해 쉘코드의 주소를 가지고 풀이를 할 것이다.

gdb로 까보아도, 16바이트를 주고 있다. 따라서 dummy는 없다는 것을 알 수있다.

| buffer(16) | sfp(4) | ret(4) |

이러한 스택 구조를 띄고 있다.

총 20바이트와 4바이트의 주소값을 넣어주면 bof가 일어난다.

먼저 환경변수부터 만들어 준다.

그 후 SHELLCODE의 주소 알아낸다

SHELLCODE의 주소는 0xbffff32b 이므로

리틀엔디언 방식으로 바꾸어 \x2b\xf3\xff\xbf 로 만들 수 있다.

그냥 buffer부터 ret까지 24바이트를 전부 주소를 넣기로 했다. 다른 것을 넣어 20바이트를 채워주고 ret에 쉘코드의 주소값만 들어가면 무엇이 들어가도 무방하다.

Flag : hacking exposed

'IT > LOB' 카테고리의 다른 글

[LOB] wolfman  (0) 2016.07.17
[LOB] orc  (0) 2016.07.17
[LOB] goblin  (0) 2016.07.17
[LOB] cobolt  (0) 2016.07.12
[LOB] gate  (0) 2016.07.11

+ Recent posts