목록CTF (53)
Sechack
아이다로 보니까 뭔가 괴상하다. _start밖에 존재하지 않는걸로 보아 순수 어셈으로 구현된게 분명하다. 어셈가지고 무슨 이상한짓을 했는지 보니까 ret대신 jmp를 사용한다. 문제 설명란에도 영어로 무언가가 써있었는데 해석해보면 많은 포너들은 return address를 덮는것을 좋아합니다. 하지만 이번에는 그러지 못할것입니다. 대충 이런뜻이다. ret자체가 없기때문에 eip조작이 불가능하다. 하지만 __@8_return_address를 보면 edx에 0x1000이 들어가는데 rsi에는 rbp-0x100이 들어간다. 그리고 __@9_return_address를 보면 leave가 있다. 아직 이 부분들이 뭘 하는지는 모르지만 rbp-0x100을 rsi에 넣고 edx에 0x1000을 넣고 read를 호출하..
바이너리를 받자마자 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를 변조할 수..