System/LOB2019. 4. 26. 19:20

▲ LOB 16번. assassin -> zombie_assassin 문제이다. zombie_assassin.c와 zombie_assassin 파일이 존재한다.

▲ 힌트에 FEBP라고 적혀있다. Facke EBP라는 뜻이다.

▲ FEBP는 구글링해서 자세히 알아보도록 하자. 더 좋은 내용이 많다.

 

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

[LOB] 15. giant -> assassin  (0) 2019.04.26
[LOB] 14. bugbear -> giant  (0) 2019.04.26
[LOB] 13. darkknight -> bugbear  (0) 2019.04.26
[LOB] 12. golem -> darkknight  (0) 2019.04.26
[LOB] 11. skeleton -> golem  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 19:18

▲ LOB 15번 문제. giant -> assassin 문제이다. assassin.c와 assassin 파일이 존재한다.

▲ 힌트에 NO stack, No RTL이라고 적혀 있다. 즉 둘다 사용 불가하다. 이건 또 어떻게 풀란 말인가???

▲ 구글님은 RET Sled 공격 기법을 사용하라 알려주셨다.

▲ ret주소에 ret 주소를 넣어주면 함수 에필로그 과정이 두번 일어나 그 다음 주소가 실행되게 된다.

때문에 system 주소를 넣어두면 그게 실행된다.

 

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

[LOB] 16. assassin -> zombie_assassin  (0) 2019.04.26
[LOB] 14. bugbear -> giant  (0) 2019.04.26
[LOB] 13. darkknight -> bugbear  (0) 2019.04.26
[LOB] 12. golem -> darkknight  (0) 2019.04.26
[LOB] 11. skeleton -> golem  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 19:14

▲ LOB 14번 문제. bugbear -> giant 문제이다. giant.c와 giant 파일이 존재한다.

▲ 이전 문제와 달리 memcpy에서 ret 부분에 execve_addr이 있는지 체크한다.

 

▲ system 함수가 아닌 execve함수를 사용해야 한다.

execve함수는 execve address와 exit address , NULL 인자값을 가진다.

우리는 여기에 exit()주소를 system함수 주소로 바꾸고 NULL을 /bin/sh 문자열 주소로 변경해 준다.

▲ print로 system함수와 execve함수의 주소를 알아낸다. /bin/sh는 이전과 같은 코드로 주소를 알아낸다.

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

[LOB] 16. assassin -> zombie_assassin  (0) 2019.04.26
[LOB] 15. giant -> assassin  (0) 2019.04.26
[LOB] 13. darkknight -> bugbear  (0) 2019.04.26
[LOB] 12. golem -> darkknight  (0) 2019.04.26
[LOB] 11. skeleton -> golem  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 19:09

 

▲ LOB 13번 문제. darkknight -> bugbear 문제이다. bugbear.c 와 bugbear 파일이 존재한다.

 

▲ RET를 덮었을 때 0xBF으로 시작하면 안된다고 한다. 즉, stack을 이용할 수 없다. 그럼 어떻게 해야할까?

▲ 힌트에도 나와 있었듯이 RTL (Return To Libc) 공격기법을 이용하면 된다.

RTL 공격 기법이란 모든 프로그램이 불러오는 공용 라이브러리에 있는 함수를 이용해 공격하는 것이다.

이중에서 우리는 system()함수를 이용하여 /bin/sh를 실행시킬것이다.

▲ gdb 에서 print system으로 system함수의 주소를 알아내고, 간단한 c코드로 /bin/sh의 문자열 주소를 알아낸다.

 system함수는 인자값이 두개인데 그 중 뒤의 인자값에 넣어주면 된다.

▲ 따라서 우리는 RET에 system함수 주소 + NOP[4] + /bin/sh 문자열 주소를 입력해 주면 된다.

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

[LOB] 15. giant -> assassin  (0) 2019.04.26
[LOB] 14. bugbear -> giant  (0) 2019.04.26
[LOB] 12. golem -> darkknight  (0) 2019.04.26
[LOB] 11. skeleton -> golem  (0) 2019.04.26
[LOB] 10. vampire -> skeleton  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 19:03

 

▲ LOB 12번 문제. golem -> darkknight 문제이다. darkknight.c과 darkknight 파일이 존재한다.

▲ 소스코드가 많이 간결해 졌다. argv[1]을 problem_child 인자값으로 넘겨 준다.

그런데 이번엔 strcpy가 아닌 strncpy로 BOF를 방지한다. 이럴 땐 어떻게 해야 할까?

▲ 바로 FPO(Frame Point Overwrite) 공격 기법을 사용하면 된다.

▲ 모든 함수들은 함수 프롤로그와 함수 에필로그로 구성되어 있어 스택 프레임을 유지하는데 사용한다. 우리는 이 특성을 이용해 SFP를 변조해준다.

▲ 원래의 SFP값은 0xbfffa94. 우리는 이를 이 뒤인 0xbfffa90을 이용한다. 이렇게 진행을 하게 되면 함수 에필로그 과정에서 다시 우리 쉘코드의 시작 주소로 이동하게 된다.

 

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

[LOB] 14. bugbear -> giant  (0) 2019.04.26
[LOB] 13. darkknight -> bugbear  (0) 2019.04.26
[LOB] 11. skeleton -> golem  (0) 2019.04.26
[LOB] 10. vampire -> skeleton  (0) 2019.04.26
[LOB] 9. troll -> vampire  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 18:58

 

▲ LOB 11번 문제. skeleton -> golem 문제이다. golem.c와 golem 파일이 존재한다.

▲ 스택을 buffer+48에서 0xBFFFFFFF 까지 전부 날려버린다.

▲ buffer 안에도, buffer 밖에도, 이름에도 전부 공격 불가능이다.

그럼 도대체 어떻게 풀란 말인가??

▲ 구글님은 말해주었다. 공유 라이브러리와 LD_PREDLOAD를 사용하라고..

▲ 프로그램은 원래 libc.so.6을 불러오게 되는데, 이것을 내가 임의로 만든 파일로 바꿔치기 해 주면 된다.

▲ 따라서 아무 내용 없는 파일을 만든 뒤 공유 라이브러리에 올려둔다. 그리고 LD_PRELOAD에 export하고 스택을 확인해 보면 우리가 만든 쉘 코드가 존재한다.

▲ 공격은 아무 것도 없이 RET[4]에 shellcode 입력 주소만 입력해 주면 된다.

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

[LOB] 13. darkknight -> bugbear  (0) 2019.04.26
[LOB] 12. golem -> darkknight  (0) 2019.04.26
[LOB] 10. vampire -> skeleton  (0) 2019.04.26
[LOB] 9. troll -> vampire  (0) 2019.04.26
[LOB] 8. orge -> troll  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 18:47

troll.c, troll 아님 vampire, vampire.c 임

▲ LOB 9번 문제. troll -> vampire 문제이다. vampire.c와 vampire 문제가 존재한다.

갑자기 많이 간단해 졌다. argv[1]의 47번째와 48번째를 검사한다. 근데 47번째가 0xff이면 안된다.

 

▲ 따라서 우리는 shellcode를 아주 멀리 넣어서 0xff가 아니게 하면 된다.

▲ 공격 페이로드는 nop를 70000개 넣고 그 뒤에 shellcode를 넣어주면 된다.

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

[LOB] 11. skeleton -> golem  (0) 2019.04.26
[LOB] 10. vampire -> skeleton  (0) 2019.04.26
[LOB] 8. orge -> troll  (0) 2019.04.26
[LOB] 7. darkelf -> orge  (0) 2019.04.26
6. wolfman -> darkelf  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 18:43

 

▲ LOB 8번 문제. orge -> troll 문제이다. troll.c와 troll파일이 존재한다.

▲ 이번에는 이전 문제와 달리 argc가 2인지 체크한다. 그리고 memset으로 argv[1]를 비워준다.

▲ 따라서 우리는 argv[2]를 사용할 수 없다. argv[2]를 사용하게 될 시 argc의 값이 3이 되기 때문이다. 우리는 다른 방법을 찾아보아야 한다.

gcc 말고 gdb 임

▲ 답은 심볼릭 링크를 이용해 argv[0]을 내가 원하는 쉘코드로 바꾸어 주는 것이다. 이 작업을 하면 argv[0]에 우리의  쉘 코드가 존재하게 된다. 이를 이용해 공격을 할 수 있다.

▲ 위에서 알아낸 주소로 공격을 성공한다.

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

[LOB] 10. vampire -> skeleton  (0) 2019.04.26
[LOB] 9. troll -> vampire  (0) 2019.04.26
[LOB] 7. darkelf -> orge  (0) 2019.04.26
6. wolfman -> darkelf  (0) 2019.04.26
[LOB] 5. orc -> wolfman  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 18:36

 

▲ LOB 7번 문제. darkelf -> orge로 넘어가는 문제이다.

힌트를 보면 egg&buffer&length&argv 이다. 더 자세히 알아보자.

▲ 기존의 방어기법 이외에 argv[0]의 길이가 77인지 아닌지 체크해준다.

argv[0]은 실행주소와 파일이름 까지가 들어간다. 근데 이게 어떻게 77이 될까?

▲ 우선 페이로드는 이전과 같다.

▲ 이전 문제와 다른 점은 argv[0]의 길이를 체크해주는 것이다.

gcc가 아니고 gdb

▲ argv[0]의 해결 방법은 바로 /를 이용하는 것이다.

./orge 랑 .//////////////////////////////orge 는 같은 명령이기 때문이다.

▲ 따라서 적절히 argv[0]을 계산하여 / 개수를 맞춰주면 공격이 성공한다.

 

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

[LOB] 9. troll -> vampire  (0) 2019.04.26
[LOB] 8. orge -> troll  (0) 2019.04.26
6. wolfman -> darkelf  (0) 2019.04.26
[LOB] 5. orc -> wolfman  (0) 2019.04.26
[LOB] 4. goblin -> orc  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 18:31

▲ LOB 6번 문제. darkelf.c와 darkelf 파일이 존재한다. 

해당 힌트는  egg&buffer&length이다. 자세히 알아보자.

▲ 코드에서는 egg, buffer 이외에 인자값의 길이를 체크해준다. 

▲ 일단 우리는 buffer안에 값을 못 쓰니까 buffer밖에 shellcode를 입력해 주어야 한다. 근데 buffer에 길이 입력 제한이 존재한다. 이러면 어떻게 해야할까??

▲ 답은 argv[2] 즉, 두번째 인자값을 이용하면 된다.

gcc가 아니고 gdb임

▲ 일단 아무렇게나 입력해 보고 두번째 인자값의 주소를 찾아준다.

▲ 이후 우리가 알아낸 해당 주소를 ret에 덮어씌우면 된다.

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

[LOB] 8. orge -> troll  (0) 2019.04.26
[LOB] 7. darkelf -> orge  (0) 2019.04.26
[LOB] 5. orc -> wolfman  (0) 2019.04.26
[LOB] 4. goblin -> orc  (0) 2019.04.26
[LOB] 3. cobolt -> goblin  (0) 2019.04.26
Posted by BadSchool