본문 바로가기

Pwnable/HackCTF

(12)
[ProjectH4C] HackCTF (x64 Buffer Overflow) 64비트의 버퍼 오버플로우도 32비트와 다를 것 없다. ebp, esp, eax대신 확장된 레지스터인 rbp, rsp, rax를 사용하며, 주소가 4바이트인 32비트와는 달리 주소의 길이가 8바이트이다. 먼저 IDA를 이용해 코드를 확인해준다. s 변수에 문자열을 입력받고, v5에는 길이를 저장한 후, s를 출력해주는 함수이다. 왼쪽에 함수들 목록을 보면 callMeMaybe 라는 함수가 있다. 쉘을 실행시켜주는 함수이다. main 함수의 ret에 callmeMaybe 함수의 주소를 덮어씌우면 된다. IDA 상에서 s의 위치는 rbp-0x110이라고 나와있다. 페이로드는 다음과 같다. A*0x110 + ebp [8Byte] + callmeMaybe [8Byte] 코드는 다음과 같다. from pwn im..
[ProjectH4C] HackCTF (내 버퍼가 흘러넘친다!!!) prob1 파일의 코드는 다음과 같다. 쉘 코드를 s에 저장하는 방식은 어떨까 했지만, s가 0x14바이트밖에 안되기 때문에 name의 주소를 알아 낸 후에 name에 쉘 코드를 넣어두고, s를 이용해 버퍼 오버플로우를 일으켜 ret 주소에 name의 시작 주소를 덮는 방식을 선택했다. 먼저 gdb를 통해 알아낸 name의 주소는 다음과 같다. name은 2번째 인자이기 때문에 0x804a060이 name의 주소가 된다. 카나리, NX-bit 등의 보호기법도 적용되어 있지 않기 때문에, buf 크기 20바이트 + sfp 4바이트 이후에 name의 주소를 덮으면 될 듯 하다. 페이로드는 다음과 같다. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3003) shel..
[ProjectH4C] HackCTF (Basic_FSB) 포맷 스트링 버그(FSB) 포맷 스트링 버그는 주로 C언어의 printf 함수를 사용할 때 발생한다. %d, %s 와 같은 것들을 포맷 스트링이라고 하는데, buf를 입력받고 해당 buf를 출력할 때 포맷 스트링을 이용해 흐름을 바꿀 수 있다. 보통 문자열을 출력하기 위해 C언어에서는 다음과 같이 코드를 작성한다. #include int main(){ char buf[]; scanf("%s", buf); printf("%s", buf); return 0; } printf 함수를 위의 형태가 아닌 아래의 형태로 사용해도 그대로 출력되기는 한다. printf(buf); 하지만 이 때, buf에 %s 와 같이 포맷 스트링을 입력하게 되면, printf("%s")가 되는데, %s에 들어갈 값을 지정해주지 않았기..
[ProjectH4C] HackCTF (bof_basic 1~2) bof_basic #1 HackCTF에서 제공하는 Pwnable 카테고리의 첫 번째 문제이다. HackCTF에서는 각 문제마다 포트를 제공하는데, 해당 서버와 포트에 값을 보낸 후에 쉘을 획득하여 flag를 획득한 후 사이트에 제출하는 방식이다. 추가로 디버깅을 위해 실행 파일도 별도로 제공한다. 제일 먼저 ctf.j0n9hyun.xyz 3000 서버에 값을 입력해보았다. 입력을 buf에 저장한 후에, 특정한 위치의 값을 확인하는 듯 한다. buf의 크기가 얼마인지, 어느 부분의 값을 덮어씌워야 하는지 gdb와 IDA를 통해 알아보았다. (gdb) disas main Dump of assembler code for function main: 0x080484cb :lea ecx,[esp+0x4] 0x080..