본문 바로가기

system

got_overwrite stack_smashing_detected got_overwrite 이번에 got_overwrite를 하면서 알게 된 사실인데.got.plt 주소 간격을 보면 64비트 기준으로 8바이트씩 매우 빡빡하게 차있는 것을 볼 수 있다.여기서 만약 strcpy에 맨 뒤에 NULL byte를 포함시키는 cin과 같은 함수로 got_overwrite를 통하여 p64(0x8)을 보내면? 위와 같이 strcpy의 got는 성공적으로 overwrite됐지만 그 다음에 있는 got가 NULL로 1바이트 덮여버린다.이 경우 나는 해당 함수의 canary가 변조되어 stack_smashing_detected 오류가 발생하였다. 직접 손으로 돌려가며 찾아야 하는 부분이라 오래 걸린다.. 이를 방지하는 방법은 p64(0x8).rstrip('\x00').ljust(7,'\x.. 더보기
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로 쉽게 풀 수 있을 것 같은데.. 아니었다.. 쇼크 그리고 .. 더보기