728x90

정수형 : int           부동 소수정 : float -> 더넓은 범위의 데이터 처리가능

                               %.2f -> 소수점 이하 둘째자리 까지 출력

 

정수 : 소수부가 없는 수 ex)2,-23,2456

부동 소수점수 : 수학에서 말하는 실수 ex)2.75, 3.16E7, 7.00, 2e-8

                     어떤 값에 소수점을 붙이면 부동 소수점 값이 된다.

 

※ 부동소수점수를 저장하는 방법이 정수와 다르다.

부동소수점 표기에서는, 하나의 수를 소수부와 지수부로 쪼개어 저장한다.

ex) 0.7E1 -> 0.7이 소수부 1이 지수부

 

int형은 부호 있는 정수(signed integer)이다.

int형의 최소범위 -32767, 32767

 

변수를 선언하면 변수를 저장하기 위한 기억공간을 할당하고, 거기에 이름을 연결하고, 각 변수에 초기값을 대입한다.

 

C언어에서는 10진수, 8진수, 16진수를 구별하기 위해 수 앞에 특별한 접두사를 붙인다.

ex) 10진수    8진수      16진수 

     16         020         0x10

위 접두사는 사용자를 위한 서비스 이다. 수가 저장되는 방식에 영향을 주지 않는다. 즉, 16,020,0x10 중 어느것을 사용하더라도 컴퓨터는 내부에서 사용하는 2진수 코드로 정확히 동일하게 저장한다.

 

10진수 출력 %d               8진수 출력 %o              16진수 출력 %x

접두사도 함께 출력 하려면 %#o, %#x를 사용한다. 이들은 각각 0,0x와 함꼐 출력한다.

 

short int == short              ,           long int == long

long long int == long long

unsigned int == unsigned

 

unsigned int 출력 : %u                     long형 값 출력 : %ld          long형 16진수 출력 : %lx     8진수 출력 : %lo

short형 10진 정수 : %hd                   short형 8진 정수 :ho          short형 16진 정수 : %hx

long long 형 : %lld                    unsigned long : %lu

 

 

 

char형 변수의 크기는 1byte, 'A'의 값은 65이다.

char형 변수에 'FATE'를 대입하면 마지막 문자상수인 E만 저장된다.

 

이스케이프 시퀀스

\a : 경보    \b : 백스페이스    \f : 폼 피드    \n : 개행    \r : 캐리지 리턴    \t : 수평 탭    \v : 수직 탭    

\\ : 백슬래쉬(\)    \':작은따옴표(')    \":큰 따옴표(")     \? : 물음표(?)    \0oo : 8진수값    \xhh : 16진수 값

 

출력장치 제어 문자

\b(back space) : 현재 라인에서 한스페이스 뒤로 옮긴다.

\f(form feed) : 다음 페이지의 시작으로 옮긴다.

\n(new line) : 다음라인 시작으로 옮긴다.

\r(carriage return) : 현재라인의 시작으로 옮긴다.

\t(horizontal tab) : 수평탭의 다음 위치로 옮긴다.

\v(vertical tab) : 수직탭의 다음 위치로 옮긴다.

 

scanf() 함수의 엠퍼샌드(&)가 그 문자를 변수 ch에 대입되도록 안내한다.

printf() 함수의 포맷 지정자는, 데이터가 저장되는 포맷이 아니라 데이터가 출력되는 포맷을 결정한다.

 

_Bool 형은 true or flase로 0아니면 1의 값을 가진다.

 

 

728x90

'Programming > C' 카테고리의 다른 글

프로그래밍 연습 2  (0) 2019.04.28
C언어 공부 4  (0) 2019.04.28
프로그래밍 연습 1  (0) 2019.04.28
C언어 공부 2  (0) 2019.04.28
C언어 공부  (0) 2019.04.28
728x90

64p -1
64p - 3
65p - 5
65 - 7

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 4  (0) 2019.04.28
C언어 공부 3  (0) 2019.04.28
C언어 공부 2  (0) 2019.04.28
C언어 공부  (0) 2019.04.28
C 데이터  (0) 2018.12.28
728x90

이스케이프 시퀀스(escape sequence)

이스케이프 시퀀스는 타이핑하기 어렵거나 불가능한 문자를 나타내는데 사용한다.

\n : 개행     \t : 탭(tab)    \b : 백스페이스 문자(back space)

이스케이프 시퀀스는 항상 백슬래쉬(\)로 시작

 

프로그램은 하나 또는 그이상의 함수 집합으로 구성된다.

함수(function)는 헤더(header)와 몸체(body)로 구성된다.

 

함수 헤더 : 그함수가 리턴하는 정보의 타입, 그 함수에 전달되는 정보의 타입, 함수 이름으로 구성

 

ex)

 

#include <stdio.h>    - 전처리기 지시자

int main(void)           -전달인자를 가진 함수 이름

------------------------------------------↑함수 헤더

{

 int q;

 q = 1;

~~~~

return 0;

}

--------------------------------------------↑ 함수 몸체

 

모든 C프로그램은 main()이라는 함수가 반드시 필요하다

-> main()은 프로그램이 처음 시작할 때 호출되는 함수이기 때문

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 4  (0) 2019.04.28
C언어 공부 3  (0) 2019.04.28
프로그래밍 연습 1  (0) 2019.04.28
C언어 공부  (0) 2019.04.28
C 데이터  (0) 2018.12.28
728x90

컴파일러 : 소스코드를 중간코드로 변환한다.

링커 : 중간코드 + 다른코드 => 실행파일을 만든다.

 

컴파일링과 링킹을 통해 프로그램 모듈화

 

링커는 이미 컴파일 된 라이브러리 코드를 가져와 프로그램에 결합한다.

 

중간파일은 오브젝트 파일이다. (file.o)

 

오브젝트 ㅍ일은 소스코드를 기계어 코드로 단순히 번역한 것일 뿐 아직 완전한 프로그램이 아니다.

(오브젝트 파일 + 다른 코드 => 실행파일)

                         ↓

다른코드 1. 시동코드

시동코드는 프로그램과 운영체제 사이의 인터페이스를 담당한다. 

->ex)window와 linux 모두 같은 하드웨어에서 운영되므로 동일한 오브젝트 코드가 두운영체제에서 모두 동작하나 두운영체제는 프로그램을 처리하는 방식이 다르기 때문에 각자에게 맞는 시동코드가 필요하다.

 

다른코드 2.라이브러리 루틴을 위한 코드

-> ex) printf()또한 실제코드는 라이브러리 (stdio.h) 안에 있다.

 

링커의 역할은 오브젝트 코드, 사용하는시스템에 맞는 시동코드, 라이브러리 코드를 묶어서 하나의 실행파일로 만드는 것이다.

 

소스코드 -> 컴파일러 -> 오브젝트 코드 -> 링커(시동코드, 라이브러리 코드) -> 실행 코드

a.out -> 실행파일

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 4  (0) 2019.04.28
C언어 공부 3  (0) 2019.04.28
프로그래밍 연습 1  (0) 2019.04.28
C언어 공부 2  (0) 2019.04.28
C 데이터  (0) 2018.12.28
728x90


int32_t -> 32비트 부호있는 정수형 변수이다.


PRId32는 inttypes.h에 정의되어 있는 "d"로 대체된다.

-------> inttypes.h 헤더 파일은 PRId32를 32비트 부호있는 값의 적당한 포맷지정자ㅋ를 나타내는 문자열로 정의한다.

해당 부분을 대체시키면

printf("me32 = %""d""\n",me32);

이 된다. 

C는 연속된 큰따옴표 문자열들을 하나의 큰따옴표 문자열로 결합한다. 

즉 printf("me32= %d\n",me32); 가 된다.


출력내용








int32_t 는 정확하게 32비트를 사용하기 때문에  고정폭 데이터형(exact width type)이라 부른다.

int_least8_t형은 8비트 부호있는 정수값을 가질 수 있는 최소폭 데이터형의 별명이다.

int_fast8_t 형은 8비트 부호있는 값들을 가장 빠르게 계산 할 수 있다. 이 데이터형을 최고속 초소폭 데이터형(fastest minimum width type)이라 부른다.




intmax_t 형은 최대폭 정수형이다.

uintmax_t 형은 부호없는 최대폭 정수형이다. 

-----> 이들은 long long 과 unsigned long 보다 더클 수 있다. C 컴파일러들이 이보다 더큰 데이터형을 정의하는것을 허용한다.




데이터형들의 크기




sizeof에 사용되는 데이터형을 위한 %zd 지정자가 존재한다.







잘못된 전달인자 사용의 예



printf함수와 scanf함수는 전달인자의 개수가 가변적이기 때문에 위와같이 전달인자를 잘못 넣을 수 있다.


float 형 값을 %d로 출력할 때, float형 값의 가장 가까운 int형값으로 변환되지않고 이상한 값을 출력한다.

전달인자의 개수를 잘못 줬을 때 컴파일러에서 에러를 출력하기도하지만 프로그램은 정상적으로 작동하기때문에 그냥 넘어갈 수 있다.

printf함수에 정확한 개수의 전달인자를 사용했는지 확인하라. 


이스케이프 문자사용



\a는 경보음을 내야하지만 내가 사용한 시스템에서는 경보음이 출력되지않았다.

\b는 백스페이스이다.

\b 7개를 통해 커서가 _ 7개 앞으로 가있다.

이후 입력을 해주고.

\n은 줄내림, \t는 tap이다. \r은 캐리지 리턴으로 커서를 현재라인의 시작 위치로 옮긴다.

입력한후에 enter키가 들어가고 10번째 줄의 printf에 의해 커서를 한줄더 밑으로 내립니다. 

10번째줄이 실행되고 11번째가 실행되지만 11번쨰 줄의 \r 캐리지 리턴으로 인해 커서가 맨앞으로가고 "우와"가 먼저 출력되고 

\t 이 실행된후 문자열이 출력되고 끝이난다.


우와 이후에 10번째 줄이 줄내림 이후에 출력는것이 아닌 이유는 11번째 함수가 10번째 함수가 실행된 후에 실행되기 때문이다. 

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 4  (0) 2019.04.28
C언어 공부 3  (0) 2019.04.28
프로그래밍 연습 1  (0) 2019.04.28
C언어 공부 2  (0) 2019.04.28
C언어 공부  (0) 2019.04.28
728x90

파일을 실행시키면 위처럼 진행된다. 해당 파일을 ida로 열어보면

main함수이다.



1번 add_note 함수이다.


show note에서 format string bug 취약점이 의심된다.

Show_note &ptr에서 fsb를 발생시킬 수 있는데 이 &ptr은 buf add_note에서 볼 수 있다.


add_note함수에서 입력값이 candidate2함수에 들어가면

v2 즉 content에 입력한 값이 &ptr로 들어간다.


add_note에 %x를 30개 저장하고 show_note를 실행하면 스택의 내용들이 나온다.


위내용을 보기위해 gdb로 열어봤다.

스택 영역을 잘 분석하면 %x로 14번째에 0xffffd048이 박혀있고, 0xffffd048은 22번째를 가리키고 있다. 이를 통해서 쉘을 얻을 수 있다.

14번째에 printf의 got를 입력하고 22번째에 shell 주소를 넣어주면 된다.

14번째의 printf got -> 0x0804b010

22번째 system("/bin/sh") -> 0x8048a37


쉘획득


system("/bin/sh")이 바이너리 안에 존재해서 쉽게 풀 수 있었다.

728x90

'CTF_writeup > 2018' 카테고리의 다른 글

PCTF_2013_ropasaurusrex  (0) 2018.12.22
MMA-CTF-2-greeting  (0) 2018.12.22
Trustealth CTF easy  (0) 2018.12.22
ISITDTU_CTF_dead_note_lv1  (0) 2018.12.22
ISITDTU CTF_xoxopwn  (0) 2018.12.22
728x90

32bit ELF 파일이고 stripped 되어있어 심볼들이 제거되어있다.

checksec으로 확인해본 결과 NX가 걸려있어 rop로 문제를 풀어야할 것이다.

위 실행파일을 ida로 열어보면

main함수이다.

sub_80483F4함수는

입력을 받는 함수인데 여기서 overflow가 발생한다.

이를 통해서 rop페이로드를 만들어주면 될것이다.


rop 계획

read 함수 주소 릭 -> libc base 주소를 알아냄 -> bss영역에 /bin/sh\x00입력 -> write got에 libc system함수 입력 -> write함수 호출 + 인자에 /bin/sh입력


read와 write함수를 사용하기 때문에 ropgadgetdms pop3ret 가젯을 써준다.


sfp까지 덮기 위한 더미 140개 -> 출력을 위한 write plt 호출 및 read got 출력

-> 입력하기 위해 read함수 호출과 bss 영역 할당, 길이는 "/bin/sh\x00"까지 -> write_got를 system으로 덮어준다. -> write 호출


페이로드



728x90

'CTF_writeup > 2018' 카테고리의 다른 글

Noote_ver0  (0) 2018.12.22
MMA-CTF-2-greeting  (0) 2018.12.22
Trustealth CTF easy  (0) 2018.12.22
ISITDTU_CTF_dead_note_lv1  (0) 2018.12.22
ISITDTU CTF_xoxopwn  (0) 2018.12.22
728x90

Format string Bug

return 위의 sprinf 함수는 %s에 v5값을 넣어서 s에서 출력해준다. 이후 return에서 해당 문자열을 출력시켜준다.


위 소스중 prinf에서 format string bug가 발생합니다. format string bug는 출력하는 문자열에 문자 format을 입력하면 해당 형식에 맞게 stack에 있는 값을 출력해줍니다.


프로그램에 일정 문자열을 삽입해주고 서식문자를 통해 해당 문자가 몇번째에 출력되는지 파악합니다.

문자 2개를 입력한뒤 문자 4개를 입력하면 12번째에 4개의 문자가 입력되는것을 확인 할 수있습니다.


계획

문자와 서식문자들을 입력할 때 사용하는 getnline함수이다.

위 함수의 strchr함수를 system함수로 바꿔주고, main을 한번더 실행시켜 main에서 인자에 /bin/sh을 입력해주면 쉘을 얻을 수 있을것이다.


getnline함수에 값을 입력한후 한번더 메인으로 돌아가기 위해


위 주소를 써준다. .fini_array는 프로세스 종료전에 실행되는 함수의 포인터 배열 이라고 나온다. 즉 프로세스가 종료될 때 실행시키는 함수이다.

이주소를 main 시작 주소로 바꿔주고 strchr주소에 system 주소를 넣어준다.


알아야 할것 : main 주소, system 주소, strchr 주소, .fini_array주소




주의할 점 : 

노란색 박스로 출력되는 부분도 %d에 포함되기때문에 aa까지 총 20바이트가 포함되어있는 값으로 계산해야한다.




format string bug에서 got overwrite를 할때 2byte씩 잘라서 보내준다. 값이 너무 크기때문


payload += "%{}d%12$hn".format((main&0xffff)-32) // “%{}d%12$hn”.format((main&0xffff)-32)에서 {}format의 내용이 들어간다. (Main&0xffff) - 32

위의 hn은 앞의 출력된 문자의 수를 2바이트 만큼 입력하겠다는 문자열이다.


payload += "%{}d%13$hn".format(0x10000+(system>>16)-(main&0xffff))

위에서 +0x10000(sytem>>16)-(main&0xffff)가 음수이기 때문이다. 위에서는 크기를 나타내야하기 때문에 +0x10000으로 양수 값을 맞춰준다.


fsb에서는 “%{}d%hn”.format(구해야하는값)을 통해서 {}에 편하게 값을 넣어주는게 좋을것같다.

728x90

'CTF_writeup > 2018' 카테고리의 다른 글

Noote_ver0  (0) 2018.12.22
PCTF_2013_ropasaurusrex  (0) 2018.12.22
Trustealth CTF easy  (0) 2018.12.22
ISITDTU_CTF_dead_note_lv1  (0) 2018.12.22
ISITDTU CTF_xoxopwn  (0) 2018.12.22

+ Recent posts