본문 바로가기

system

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하고 익스해야겠네요. 어쨋든 전체적인 .. 더보기
2014 codegate angry_doraemon angry_doraemon 2014 codegate angry_doraemon1번 메뉴에 쉘 실행 명령이 존재한다.4번 메뉴에서 오버플로우가 발생한다. 하지만 rop는 불가능, canary 존재5번 메뉴 First Attack에서함수 포인터 buf에 read로 4바이트를 받고 있고 밑에서다시 buf에 4바이트를 입력 받고 buf()를 실행시켜 준다.(HIBYTE는 매크로인데 상위 1바이트를 의미함, 즉 \x08로 시작하면 안됨 코드섹션, 데이터섹션 힙..등등으로 점프할 수 없다.) leak을 찾아야 rop를 하는데.. 여기서 좀 헤맷다.read는 맨 뒤에 NULL을 안 넣기 때문에 밑에 sprintf, write에서 leak 발생여기서 canary leak을 해야 하는데 canary는 하위 1바이트가 '.. 더보기
2013 hdcon luckyzzang luckyzzang 2013 hdcon luckyzzang바이너리는 소켓 통신 프로그램이며 while 문으로 accept를 기다리고 fork 한다. fork한 자식 프로세스는 func 함수를 실행시킨다. funcfunc 함수에서는 recv 함수로 값을 입력받는데,rand % 100 + 1025 만큼 입력받는다. 즉 buf에서 오버플로우가 발생한다. 풀다보니 왠지 익숙한 느낌이 들었었는데 BoB 과제였다.. 어쨋든 리버스 커넥션이나 리다이렉트, dup2 함수를 이용한 방법이 있을 것 같다.NX가 걸려있는 상황에서의 BOF라 ROP를 시도하면 해결될 것 같은데 문제는 BOF 길이가 100% reliable한 payload를 만들어주지 않는 길이인 것이다. 이 때문에 libc_base를 구하는 첫 번째 sta.. 더보기
2016 whithat malloc malloc 2016 whitehat mallocStack Leak, malloc, free, modify를 자유롭게 할 수 있다. mallocsize 32라면 malloc(32)를 해준다.즉, size를 64로 넣으면 malloc(32)가 된다.modify33바이트만큼 buf에 입력을 받고 heap에 memcpy를 통해 복사한다. 바로 입력을 안받고 이렇게 하는 이유를 모르겠다.. free, list, exit는 그냥 이름대로의 기능이다.32바이트 길이니끼니 fastbin을 떠올릴 수 있겠고 자유로운 할당과 해제가 가능하고 우리가 입력한 size 변수가 스택에 기록되니 fastbin dup into stack이 가능할 것 같다. 이걸 몰라서 헤매고 있었는데 이 flag를 읽어주는 함수가 존재한다. fa.. 더보기
2015 codegate yocto yocto 2015 codegate - yoctoglob 전역 변수에 80바이트 입력을 받는다.그리고 밑에서 v2로 점프하는데 이 부분에 대한 어셈을 보면push eax, push edx를 하고 점프를 하는데 eax와 edx를 보면ebp+var_14, ebp+var_C를 넣고 점프를 한다. 이에 대한 값을 확인해 보면atoi의 반환 값이 들어간다는 것을 알 수 있다.즉, ebp+var_14에는 atoi(glob)의 반환 값이,ebp+var_C에는 atoi(v0+1)의 값이 들어가는 것이다. payload를 입력할 전역변수 glob과 값을 push하고 jmp할 수 있는 구문은 RTDL(Return To Dynamic Linker)을 가능하게 한다. RTDL 과정을 간략히 설명하면reloc_offset, l.. 더보기