460 likes | 764 Views
Incognito CTF 일반부 문제 풀이. setuid0@CodeRed. BTtraveler – shellcode 150 pts. 쉘코드를 섞어서 넘겨주는 바이너리 ( BTtraveler ) 와 인자로 쉘코드를 받아서 실행해주는 바이너리 ( vuln ) 로 구성됨. BTtraveler. 쉘코드를 이상하게 바꿔서 실행해주는 것 같으니 최대한 간단하게 작성 read(0, ebp , 256) jmp ebp. BTtraveler.
E N D
Incognito CTF 일반부문제 풀이 setuid0@CodeRed
BTtraveler – shellcode 150 pts • 쉘코드를 섞어서 넘겨주는 바이너리(BTtraveler)와 • 인자로 쉘코드를 받아서 실행해주는 바이너리(vuln)로 구성됨
BTtraveler • 쉘코드를 이상하게 바꿔서 실행해주는 것 같으니 최대한 간단하게 작성 • read(0, ebp, 256) • jmpebp
BTtraveler • 어떻게 섞는지는 분석하지 않고 vuln으로 넘어가는 인자를 확인해서 원하는 쉘코드가 들어갈 때 까지 계속 바꿔봄 read-jmp쉘코드
BTtraveler • read-jmp쉘코드 후에 리버스 커넥션 쉘코드를 보내주면 끝!
Ihatemath – Web 350 pts • 필터링이 잔뜩 걸려있고 where문에 SQL 인젝션이 된다 • answer table은 비어있고 clue 테이블에 키가 있음
ihatemath • pow(clue, clue) = ??? • 1 XOR 1 = 0 • pow(x, 0) = 1
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
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
ihatemath • 데이터가 없는 table에서의 where 문.. • like를 사용하면 subquery가실행됨 • select * from answer where answer=answer ^ answer like (…)
ihatemath • 막혀있지 않은 함수와 XOR로 만든 숫자들로 clue 테이블의 내용을 추출
Poem • 시 목록을 보거나 내용을 추가하는 등의 기능을 가진 데몬
Poem • 입력 함수에서 입력 받은 내용의 끝부분에 NULL을 붙이지 않음
Poem • list 함수에서 info leak 발생 next (4 bytes) name (64 bytes) author (32 bytes) content (512 bytes) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ………. Data Address Leak!
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)
Poem • puts@plt를 이용하여 atoi@gotleak • leak 이후에 다시 main으로 return main + 0x125 atoi@got puts@plt
Poem • atoi주소에서 오프셋을 계산하여 execve주소와 /bin/sh의 주소를 알아냄 • execve(“/bin/sh”, NULL 주소, NULL 주소); &NULL &”/bin/sh” &NULL AAAA execve@libc
PHP • 난독화가 엄청나게 되어있고 • 숫자를 잔뜩 보내주고 숫자 1개를 입력 받은 후에 원하는 값과 일치하면 key를 준다
PHP • 숫자들이 time(0)을 기준으로 생성됨
PHP • 로컬에서 바이너리를 실행하여 디버거로 입력 값과 비교하는 값을 추출
DS • system(“clear”) ???
DS • PATH 환경 변수를 조작해서 쉘을 얻음
PhoneBook • 전화번호부 데몬 • add, delete, show, shell 기능이 있음
PhoneBook • bss에 올라가 있는 패스워드를 알아야 쉘 실행 가능
PhoneBook • target->next = target->next; ??? • Use-After-Free 취약점
PhoneBook • name_ptr을 조작해주면 원하는 메모리를 leak 할 수 있음
PhoneBook • 번호를 3개 add 한 후 (작은 크기) • 첫번째와 마지막을 delete하고 • 번호 2개를 add 하면서 (124 바이트) • bss의 패스워드 주소를 free된 번호의 name_ptr자리에 넣어주면 • 패스워드를 leak해서 쉘을 얻을 수 있음
I_love_python • 여러 함수들이 있는데 fib 함수의 input에서 취약점 발생
I_love_python • input의 eval결과에 따라 fib의 결과가 달라지므로 일단 키의 길이를 알아낸 후 한 글자씩 추출
Architecture • add, sub, addi, subi, xor, print, lw, sw등의 명령을 지원하는 일종의 가상 머신 • 명령 입력, 파싱, 처리 thread가 따로 있음
Architecture • LOAD, STORE로 뭔가를 해야 할 것 같지만 범위 제한이 있음 • 0 ~ 255 • int mem[256];
Architecture • Race Condition! • LOAD, STORE 범위를 체크하는 thread와 실제 메모리 읽기 쓰기를 • 처리하는 thread가 다른 것을 이용 • 일단 체크를 통과한 후에 인덱스 변경
Architecture • addieaxeax 6301152 • subiebxebx 66 • xorecxecxebx • sweaxecx 0 • print eax • eax = 쉘코드 주소 • ebx = 덮어씌울 got의 index • ecx가 0이므로 store 주소 검증 통과 • ecx = ebx • array[ebx] = eax • 쉘코드 실행!
PhoneBook2 • 전화번호부 데몬 • 등록, 목록 보기, 항목 보기, 삭제, 변경 등의 기능이 있음
PhoneBook2 • 입력 함수에서 내용 끝에 NULL을 붙여주지 않는다
PhoneBook2 • 입력 함수에서 내용 끝에 NULL을 붙여주지 않는데 • change 함수에서 변경된 데이터를 복사 할 때 strlen과 memcpy를 사용하고 • phone_number의 버퍼와 name의 버퍼가 붙어있기 때문에 • phone_number에 “A”*64를 입력하면 name으로 next 포인터를 덮을 수 있음
PhoneBook2 • next 포인터를 조작하면 show_list함수로 원하는 주소에 읽기가 가능하고 • change 함수로 원하는 주소에 쓰기가 가능
PhoneBook2 • next 포인터를 조작하면 show_list함수로 원하는 주소에 읽기가 가능하고 • change 함수로 원하는 주소에 쓰기가 가능
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가 호출시쉘코드가 실행됨