본문 바로가기

분류 전체보기

2017 codegate angrybird angrybird 2017 codegate angrybird맨 처음에 바로 exit를 시켜준다 뭐지.. cfg를 보면 엄청 긴데 하나 하나 쭉 보면 연산을 통해 계속해서 분기하는 것을 알 수 있다. 맨 마지막 블록을 보면 내가 입력한 걸 출력해 준다. 앵거로 푸는 문제인가 보다. 그냥 exit 다음부터 실행시키도록 하고 앵거를 돌리면 될 것 같다. 또한 리턴 값을 바꿔줘야 하는 곳이 존재하고 문자열을 "hello"로 맞춰줘야 하는 곳이 존재한다. 근데 우리는 어차피 bit-vector를 이용할 것이므로 fgets 뒤에 부분은 다 재끼고 fgets 다음부터 시작하자. 즉, hello만 맞춰주면 된다. import angr​p = angr.Project('angrybird', load_options={'au.. 더보기
2014 plaidCTF kappa kappa 2014 plaidCTF kappa싸우는 도중 포켓몬을 바꿀 수 있는 4번 히든 메뉴 존재 기본으로 주는 Bird Jesus의 체력을 나타내는 곳이 379번 째 인덱스고, kakuna의 체력을 나타내는 곳은 다른 곳이다. Charizard도 마찬가지. 즉 저 값은 kakuna의 입장에서는 \x0이며 Charizard의 입장에서는 ascii_art가 있는 곳이 된다.이걸 써먹을 곳이 없는데 기본 포켓몬으로만 싸우라는 건가... 그리고 포켓몬이 다 차면 원래 있던 자리에 포켓몬을 덮어씌우는데 포켓몬 랭크에 관한 정보는 덮어씌우지 않는다. 포켓몬 정보를 출력하는 함수를 호출하는 부분이다. 이 부분을 덮어씌우면 쉘을 딸 수 있을 것 같다. Charizard의 artwork 크기가 kakuna의 art.. 더보기
2017 codegate messenger messenger 2017 codegate messengerNX가 존재하지 않는다~ Leave Messege는 custom malloc을 해준다. 할당하자 마자 fd와 bk가 존재한다. 그리고 bss영역에서 배열로 heap의 주소를 관리한다 -> unsafe unlink ?! Remove Message는 custom free를 해준다. unlink!, 근데 bk->fd와 fd->bk가 자신이란걸 검사를 안하니 unsafe unlink를 안해도 된다. Change Messege에서 heap overflow가가능하다. View Message에서 fd와 bk를 leak할 수 있다. 익스플로잇 흐름도는 다음과 같다.heap_overflowheap_overflowheap_overflowmalloc_Amalloc_.. 더보기
2017 codegate hunting hunting 2017 codegate hunting이렇게 6가지 메뉴가 존재한다. 위와 같이 체력, 공격력, 공격 타입 등을 전역변수로 관리한다. 보스를 잡으면 셋팅해주는 0x6033d0이 존재하면 v8에 오버플로우를 내준다. 그리고 5번째 메뉴에도 오버플로우가 존재한다. 보스를 잡으면 system("clear")가 실행 된다. 보스를 잡으면 보스가 업그레이드 된다. 체력과 레벨이 올라가는데 체력은 전역 변수에서 관리하고 있다. 위와 같이 배열로 64, 1000, 3000, 9223372036854775806(0x7FFFFFFFFFFFFFFE)또한 srand seed값을 맞춰 rand값을 알아낼 수 있다. 즉 canary만 어떻게 하면 rop로 쉽게 풀 수 있을 것 같은데.. 아니었다.. 쇼크 그리고 .. 더보기
2017 codegate babymisc babymisc 2017 codegate babymisc1번 스테이지는 plain text는 똑같아야 하지만 cyper text는 다르고 길이는 똑같아야 한다. base64는 8비트 문자를 6비트 문자로 표현한다. 8비트 문자 3개가 6비트 문자 4개가 되기 때문에 padding 처리가 필요하다. 이 과정에서 base64 collision이 발생한다. 위와 같이! 2번 스테이지는 다른 길이의 cyper text가 plain text는 똑같아야 한다. 그냥 뒤에 패딩 하나 더 넣어주면 된다. 요로코롬 스테이지 3은 regex 명령어들로 우리의 문자열을 검사하고 있고 밑에서는 위에 regex에 걸리지 않았을 시 system('echo -n {our_string} | base64 -d | sh')를 실행시켜 .. 더보기
pwnable.tw start 보호되어 있는 글입니다. 더보기
2017 codegate babypwn babypwn 2017 codegate babypwn첫 번째 echo 메뉴에서 100바이트만큼 오버플로우! canary가 존재하지만 NULL을 없앰으로써 leak이 가능하다. 그리고 숨어있는 system 함수 ~ 즉 libc를 구할 필요 없이 plt를 호출하면 된다.익스플로잇 흐름도는 다음과 같습니다.overflowoverflowstartcanary leakrop 이번에는 ELF를 이용해서 rop를 해봤습니다xxxxxxxxxxfrom pwn import *​e = ELF('./babypwn')s = connect('localhost', 8181)​def echo_(pay): s.recvuntil("> ") s.sendline('1')​ s.recvuntil(': ') s.sendline(pay)def e.. 더보기
2014 plaidCTF ezhp ezhp 2014 plaidCTF ezhp1번 메뉴에서 최대 1022개까지 buf[0]부터 쭉 주소 값을 넣을 수 있다. alignment가 12인 custom malloc인듯하다. delta는 intptr_t 자료형인데 int랑 별반 다를거 없는 것 같다.. 그리고 2번 메뉴에서 size, bk, fd를 가지고 unlink를 수행한다. 3번 메뉴에서는 오버플로우가 나서 다음 청크의 size, fd, bk를 덮어씌울 수 있다. 마지막으로 4번 메뉴에서 null byte를 없애 leak을 진행할 수 있다. 풀면서 안건데 heap에 쉘코드 넣었을 때 쉘코드 오염되는거 잘 보셔야 합니다..ㅜ unlink 하고 바로 익스플로잇은 쉘코드가 오염되서 힘들고 한번 더 change하고 익스해야겠네요. 어쨋든 전체적인 .. 더보기