본문 바로가기

system/writeup

2017 codegate petshop petshop 2017 codegate petshop처음 시작할 때 24바이트를 할당한 후 이를 인자로 sub_401e9e가 불린다. 첫 번째, buy 부분을 보면 72바이트 할당을 해준다. 이 주소를 가지고 있는 변수를 v12라 했을 때*v12 = function address (virtual method)*(v12+8) = name*(v12+16) = sound*(v12+24) = food이런 식으로 저장이 되며 처음 시작할 때 할당했던 24바이트 메모리 공간에 자신의 주소를 쓴다. (a1, a1+8)a1+16에는 buy_pet_num이 들어간다.최대 2마리까지 살 수 있다. 두 번째 메뉴는 virtual method의 function addr을 0x402800으로 만든 후 delete 해준다. 세 .. 더보기
2014 hack.lu oreo oreo 2014 hack.lu oreo1번 메뉴에서 할당을 해주는데 최대로 chunk_addr+25+56만큼 값을 입력할 수 있고 64byte만큼 할당이 되기 때문에 prev_size, size, fd, bk를 모두 덮어씌울 수 있다.그리고 chunk_addr + 13에 먼저 할당된 힙이 존재하면 주소를 써준다. 2번 메뉴는 출력을 해준다. i+13을 바꿔 leak을 진행할 수 있겠다. 3번 메뉴는 v2+13을 계속해서 참조하여 free를 해준다. House of spirit! 4번 메뉴는 페이로드를 넣는 곳인가 보다.. 이게 전역변수가 포인터인 경우는 ctf에서 처음 봐서 너무 헷갈렸다.. 얘도 똑같이 32비트 기준으로 4바이트 주소값을 저장 한다. 이 오류때문에 정말 많이 고생했는데 코드 구현부를 .. 더보기
pwnable.tw orw 보호되어 있는 글입니다. 더보기
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')를 실행시켜 .. 더보기