목록2021/03/05 (3)
Sechack
FSB문제를 풀다보면 주소를 2바이트, 1바이트 단위로 쪼개서 페이로드에 집어넣어야되는 상황이 흔하게 생긴다. (사실 2바이트 쪼개서 넣는게 가장 일반적인데 경우에 따라서 1바이트까지 쪼개야하는 경우가 생긴다.) 주소를 쪼개서 넣는이유는 한번에 넣어버리면 화면에 출력되는 시간이 너무 길다. (%n서식지정자는 출력된만큼 덮어쓰기 때문이다.) 바이너리에 따라서 익스플로잇 시간제한이 있을수도 있고 무엇보다 익스플로잇 시간이 너무 오래걸리기 때문에 주소를 쪼개서 넣어서 익스플로잇 시간을 단축하는것이다. 일단 주소 쪼개기의 예를 들자면 printf got를 system함수의 주소로 덮는다 가정해보자. printf got : 0x08048782 system addr : 0xf7ed8a40 라고 치고 offset이 ..

바이너리를 받자마자 ida로 까봤다. gets함수 부분에서 버퍼 오버플로우가 발생한다. 정확한 offset파악을 위해 gdb로 main함수를 까보았다. rbp-0x40부터 입력받는다. 그렇다면 0x48만큼 더미를 주면 rip를 변조할 수 있다. 바로 일반적인 rop페이로드 작성했다. very easy하게 풀리는줄 알았으나 잉? 처음에는 단순히 심볼을 못읽나보다 생각하고 직접 구하려고 gdb를 다시 까봤다. 음... 뭔가 이상하다... 설마 하고 static인지 확인해봤더니... 설마가 사람잡는다. static이었다...ㅠ 그러면 전형적인 rop처럼 libc의 execve나 system함수를 호출할 수 없다. 쉘코드 삽입은 nx때문에 안될것같고 syscall을 활용해야할것같았다. 순간 머릿속에서 드림핵에서..

TRUST CTF가 진행중인지 모르고 대회 당일날 reversing.kr이나 풀고있었다. 뒤늦게 지인이 왜 TRUST CTF참가 안했냐고 물어봐서 알게되었다. ㅋㅋ 뒤늦게라도 한번 쉬운 포너블문제 풀어보았다. 순수 어셈이다. 헥스레이 쓸 필요가 없었다. 그리고 아래 /bin/sh문자열도 꽁으로 준다. 문자열을 출력하고 입력을 받고 종료하는 단순한 프로그램이다. 보통 ebp+offset꼴로 스택에 접근하던데 그냥 esp에 입력받는다. 순수 nasm이어서 그런지 평소에 보지 못했던 특이한 부분들이 좀 있었다. 뭐 어쨌든 esp에 입력받는다. gdb로 살펴보니까 esp+8이 ret이었다. (esp에 입력받고 pop을 두번 하므로 ret는 esp+8이 되게 된다.) 근데 이제부터가 문제이다. eip를 변조할 수..