1 / 46

Incognito CTF 일반부 문제 풀이

Incognito CTF 일반부 문제 풀이. setuid0@CodeRed. BTtraveler – shellcode 150 pts. 쉘코드를 섞어서 넘겨주는 바이너리 ( BTtraveler ) 와 인자로 쉘코드를 받아서 실행해주는 바이너리 ( vuln ) 로 구성됨. BTtraveler. 쉘코드를 이상하게 바꿔서 실행해주는 것 같으니 최대한 간단하게 작성 read(0, ebp , 256) jmp ebp. BTtraveler.

tola
Download Presentation

Incognito CTF 일반부 문제 풀이

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Incognito CTF 일반부문제 풀이 setuid0@CodeRed

  2. BTtraveler – shellcode 150 pts • 쉘코드를 섞어서 넘겨주는 바이너리(BTtraveler)와 • 인자로 쉘코드를 받아서 실행해주는 바이너리(vuln)로 구성됨

  3. BTtraveler • 쉘코드를 이상하게 바꿔서 실행해주는 것 같으니 최대한 간단하게 작성 • read(0, ebp, 256) • jmpebp

  4. BTtraveler • 어떻게 섞는지는 분석하지 않고 vuln으로 넘어가는 인자를 확인해서 원하는 쉘코드가 들어갈 때 까지 계속 바꿔봄 read-jmp쉘코드

  5. BTtraveler • read-jmp쉘코드 후에 리버스 커넥션 쉘코드를 보내주면 끝!

  6. Ihatemath – Web 350 pts • 필터링이 잔뜩 걸려있고 where문에 SQL 인젝션이 된다 • answer table은 비어있고 clue 테이블에 키가 있음

  7. ihatemath • pow(clue, clue) = ??? • 1 XOR 1 = 0 • pow(x, 0) = 1

  8. ihatemath • 심지어 숫자도 막혀있기 때문에 숫자부터 만들어줘야 된다.. • pow(clue,clue)^pow(clue,clue)  0 • pow(clue,pow(clue,clue)^pow(clue,clue))  1 • (right(left(oct(~pow(clue,pow(clue,clue)^pow(clue,clue)))^pow(clue,pow(clue,clue)^pow(clue,clue)),left(oct(~pow(clue,pow(clue,clue)^pow(clue,clue)))^pow(clue,pow(clue,clue)^pow(clue,clue)),pow(clue,pow(clue,clue)^pow(clue,clue)))),pow(clue,pow(clue,clue)^pow(clue,clue)))^pow(clue,pow(clue,clue)^pow(clue,clue)))  2

  9. ihatemath • Error Based Blind SQL Injection • if(조건, (error), 1) • select pow(~pow(clue,pow(clue,clue)^pow(clue,clue)),~pow(clue,pow(clue,clue)^pow(clue,clue))) from clue ERROR 1690

  10. ihatemath • 데이터가 없는 table에서의 where 문.. • like를 사용하면 subquery가실행됨 • select * from answer where answer=answer ^ answer like (…)

  11. ihatemath • 막혀있지 않은 함수와 XOR로 만든 숫자들로 clue 테이블의 내용을 추출

  12. Poem • 시 목록을 보거나 내용을 추가하는 등의 기능을 가진 데몬

  13. Poem • 입력 함수에서 입력 받은 내용의 끝부분에 NULL을 붙이지 않음

  14. Poem • list 함수에서 info leak 발생 next (4 bytes) name (64 bytes) author (32 bytes) content (512 bytes) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ………. Data Address Leak!

  15. Poem • show 함수에서 stack buffer overflow 발생 • author가 NULL로 끝나지 않아서 content까지 복사되면 256 byte가 넘친다! next (4 bytes) name (64 bytes) author (32 bytes) content (512 bytes) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RET … buf (256 bytes)

  16. Poem • puts@plt를 이용하여 atoi@gotleak • leak 이후에 다시 main으로 return main + 0x125 atoi@got puts@plt

  17. Poem • atoi주소에서 오프셋을 계산하여 execve주소와 /bin/sh의 주소를 알아냄 • execve(“/bin/sh”, NULL 주소, NULL 주소); &NULL &”/bin/sh” &NULL AAAA execve@libc

  18. PHP • 난독화가 엄청나게 되어있고 • 숫자를 잔뜩 보내주고 숫자 1개를 입력 받은 후에 원하는 값과 일치하면 key를 준다

  19. PHP

  20. PHP

  21. PHP • 숫자들이 time(0)을 기준으로 생성됨

  22. PHP • 로컬에서 바이너리를 실행하여 디버거로 입력 값과 비교하는 값을 추출

  23. DS • system(“clear”) ???

  24. DS • PATH 환경 변수를 조작해서 쉘을 얻음

  25. PhoneBook • 전화번호부 데몬 • add, delete, show, shell 기능이 있음

  26. PhoneBook • bss에 올라가 있는 패스워드를 알아야 쉘 실행 가능

  27. PhoneBook • target->next = target->next; ??? • Use-After-Free 취약점

  28. PhoneBook • name_ptr을 조작해주면 원하는 메모리를 leak 할 수 있음

  29. PhoneBook • 번호를 3개 add 한 후 (작은 크기) • 첫번째와 마지막을 delete하고 • 번호 2개를 add 하면서 (124 바이트) • bss의 패스워드 주소를 free된 번호의 name_ptr자리에 넣어주면 • 패스워드를 leak해서 쉘을 얻을 수 있음

  30. PhoneBook

  31. I_love_python • 여러 함수들이 있는데 fib 함수의 input에서 취약점 발생

  32. I_love_python • input의 eval결과에 따라 fib의 결과가 달라지므로 일단 키의 길이를 알아낸 후 한 글자씩 추출

  33. I_love_python

  34. Architecture • add, sub, addi, subi, xor, print, lw, sw등의 명령을 지원하는 일종의 가상 머신 • 명령 입력, 파싱, 처리 thread가 따로 있음

  35. Architecture • LOAD, STORE로 뭔가를 해야 할 것 같지만 범위 제한이 있음 • 0 ~ 255 • int mem[256];

  36. Architecture • Race Condition! • LOAD, STORE 범위를 체크하는 thread와 실제 메모리 읽기 쓰기를 • 처리하는 thread가 다른 것을 이용 • 일단 체크를 통과한 후에 인덱스 변경

  37. Architecture • addieaxeax 6301152 • subiebxebx 66 • xorecxecxebx • sweaxecx 0 • print eax • eax = 쉘코드 주소 • ebx = 덮어씌울 got의 index • ecx가 0이므로 store 주소 검증 통과 • ecx = ebx • array[ebx] = eax • 쉘코드 실행!

  38. Architecture

  39. PhoneBook2 • 전화번호부 데몬 • 등록, 목록 보기, 항목 보기, 삭제, 변경 등의 기능이 있음

  40. PhoneBook2 • 입력 함수에서 내용 끝에 NULL을 붙여주지 않는다

  41. PhoneBook2 • 입력 함수에서 내용 끝에 NULL을 붙여주지 않는데 • change 함수에서 변경된 데이터를 복사 할 때 strlen과 memcpy를 사용하고 • phone_number의 버퍼와 name의 버퍼가 붙어있기 때문에 • phone_number에 “A”*64를 입력하면 name으로 next 포인터를 덮을 수 있음

  42. PhoneBook2 • next 포인터를 조작하면 show_list함수로 원하는 주소에 읽기가 가능하고 • change 함수로 원하는 주소에 쓰기가 가능

  43. PhoneBook2 • next 포인터를 조작하면 show_list함수로 원하는 주소에 읽기가 가능하고 • change 함수로 원하는 주소에 쓰기가 가능

  44. PhoneBook2 • 번호 2개 register • change로 1번 node의 next를 .bss의 head 포인터의 주소로 덮음 • show list로 head 포인터 leak (첫 번째 node의 주소) • change로 1번 node의 next를 puts@got의 주소로 덮고 힙에쉘코드 복사 • change로 2번 node를변경하여 puts@got를 쉘코드 주소로 덮음 • puts가 호출시쉘코드가 실행됨

  45. 감사합니다

  46. QNA

More Related