-
[Dreamhack] baby-bof
#include #include #include #include #include #include #include void proc_init () { setvbuf (stdin, 0, 2, 0); setvbuf (stdout, 0, 2, 0); setvbuf (stderr, 0, 2, 0); } void win () { char flag[100] = {0,}; int fd; puts ("You mustn't be here! It's a vulnerability!"); fd = open ("./flag", O_RDONLY); read(fd, flag, 0x60); puts(flag); exit(0); } long count; long value; long idx = 0; int main () { char n..
-
c언어 입력 버퍼
#include int main() { char a; char b; scanf("%c", &a); scanf("%c", &b); printf("a: %c\nb: %c\n", a, b); } 위와 같은 코드가 있을 때 a에 입력값으로 asdf을 주게 되면 입력버퍼에는 asdf가 들어가게 되고 변수 a에는 서식지정자 %c와 매칭되는 a가 들어가게 된다. 그리고 %c로 b를 입력을 받을 땐 이미 입력버퍼에 값(sdf)가 들어있기 때문에 scanf에서는 입력을 받지 않고 입력버퍼에서 서식지정자 %c와 매칭되는 s를 가져오게 된다. 즉 scanf는 입력 버퍼에 값이 없을 때는 입력을 받지만 입력 버퍼에 값이 존재한다면 서식지정자와 매칭되는 값을 입력버퍼에서 가져온다는 것을 알 수 있다. 그 이유 때문에 scanf..
-
[ codegate - pwn] librarian
main __int64 __fastcall main(__int64 a1, char **a2, char **a3) { unsigned int v3; // eax int v5; // [rsp+8h] [rbp-798h] BYREF int v6; // [rsp+Ch] [rbp-794h] char book_list[1928]; // [rsp+10h] [rbp-790h] BYREF unsigned __int64 v8; // [rsp+798h] [rbp-8h] v8 = __readfsqword(0x28u); sub_184C(); v3 = time(0LL); srand(v3); memset(book_list, 0, 0x780uLL); while ( book_num 14 ) { puts("The book list is ..
-
[ CCE 사이버공격방어대회 ] n0t rand0m
우리 팀이 예선 7등으로 본선을 가게 되었다. 그런데 좀 아쉬운 점은 내가 개인사정으로 인해 본선날에 시간이 안 돼서 못 간다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 전체 코드 void __fastcall __noreturn main(int a1, char **a2, char **a3) { unsigned int v3; // eax unsigned int nbytes; // [rsp+0h] [rbp-30h] unsigned int case_1; // [rsp+4h] [rbp-2Ch] char name[8]; // [rsp+8h] [rbp-28h] BYREF char comment[24]; // [rsp+10h] [rbp-20h] BYREF unsigned __int64 v8; // [rsp+28h] [rbp-8..
-
[ Dreamhack ] __environ
이 문제도 바로 이전에 올린 블로그 내용과 같이 environ ptr을 사용해서 푸는 문제이다. #include #include #include #include #include void sig_handle() { exit(0); } void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); signal(SIGALRM, sig_handle); alarm(5); } void read_file() { char file_buf[4096]; int fd = open("./flag", O_RDONLY); read(fd, file_buf, sizeof(file_buf) - 1); close(fd); } int main() { char buf[1024]; lon..
-
[ Dreamhack ] environ
#include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } int main() { char buf[16]; size_t size; long value; void (*jump)(); initialize(); printf("stdout: %p\n", stdout); printf("Size: "); scanf("%ld", &size); printf("Data: "); read(0..
-
[ Dreamhack ] BINARY_FIX_TOOL
이 문제는 일반적인 포너블 문제처럼 바이너리가 제공되지 않고 nc로 접속해서 바이너리를 fix하고 실행시켜 쉘을 따야 한다. 1번 메뉴를 통해 바이너리를 bytes 또는 인코딩 된 것으로 볼 수 있다. bytes로 바이너리를 출력해보겠다. 그럼 위와 같이 뭐가 많이 나온다. 위 프로그램은 printf로 Hello world를 출력해주는 코드이다. 바이너리에서 저 printf 부분과 Hello world를 출력해주는 프로그램이다. 그런데 바이너리에서 저 함수 있는부분을 만약 puts로 변경하면 이 프로그램은 실행될 때 puts("Hello world")로 실행이된다. 현재 문제에서 바이너리를 fix 할 수 있기 때문에 저 printf를 system으로 변경하고 Hello world 부분을 sh\x00으로 ..
-
[ Dreamhack ] house_of_spirit
house of spirit은 free함수를 통해 자신이 원하는 임의의 메모리를 해제할 수 있을 때 사용할 수 있는 공격 기법이다. tcache는 속도 등 여러가지 이유로 보안 검사들이 많이 생략되어 있다. 그래서 stack에 실제 tcache 청크와 같은 구조를 가지는 청크를 구성하고 해당 영역을 free하면 stack 영역을 해제하여 tcache에 stack 영역을 넣을 수 있다. 그리고 ptmalloc은 비슷한 크기의 요청이 오면 재사용 한다는 특징이 있다. 이를 통해 stack 주소로 동적 할당을 받을 수 있다. 만약 해당 프로그램에서 동적 할당을 받은 뒤 그 할당받은 주소에 입력을 줄 수 있다면 bof가 발생할 수도 있고 그 프로그램의 지역변수 등을 바꿀 수 있다. 위 코드와 같이 data의 주..
-
ptmalloc2
ptmalloc은 리눅스에서 사용하는 memory allocator이다. 모든 프로세스는 실행 중에 메모리를 동적으로 할당하고 해제하는 과정이 매우 빈번하게 일어나는데 이 동작을 빠르고 메모리의 낭비 없이 이뤄지도록 하는 역할을 memory allocator이 한다. ptmalloc2 역할 - 메모리 낭비 방지 할당 요청이 발생하면 이전에 해제된 메모리 공간중 비슷한 크기의 메모리 공간이 있는지 탐색, 작은 크기의 요청 발생시 해제된 메모리 공간 중 큰 메모리 공간이 있으면 그 영역을 나눠주기도 한다. - 재사용 빠른 메모리 재사용을 위해 동적할당된 메모리를 해제할 때 tcache 또는 bin이라는 연결리스트에 저장해둠 - 단편화 방지 단편화가 심해지면 각 데이터 사이에 공간이 많아져 메모리 사용의 효율..
-
[ baekjoon ] 25206번 - 너의 평점은
#include #include float al_to_num(char rating[]); int main() { char subject[51]; float score; char rating[3]; float total1 = 0; float total2 = 0; float a; for (int i = 0; i < 20; i++) { scanf("%50s", subject); scanf("%f", &score); scanf("%2s", rating); // 등급 P 인 과목 제외 if (rating[0] != 'P') { a = al_to_num(rating); total1 += score * a; // 학점 * 과목평점 total2 += score; // 학점의 총합 } } printf("%f", tota..
-
[ Dreamhack ] Kind kid list
int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { char password[8]; // [rsp+0h] [rbp-E0h] BYREF __int64 v4; // [rsp+8h] [rbp-D8h] char name[8]; // [rsp+10h] [rbp-D0h] BYREF __int64 v6; // [rsp+18h] [rbp-C8h] char dest[8]; // [rsp+20h] [rbp-C0h] BYREF __int64 v8; // [rsp+28h] [rbp-B8h] char kid_list[132]; // [rsp+30h] [rbp-B0h] BYREF char src[8]; // [rsp+B4h] [rbp-2Ch]..
-
[ baekjoon ] 1316번 - 그룹 단어 체커
https://www.acmicpc.net/problem/1316 1316번: 그룹 단어 체커 그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때 www.acmicpc.net #include #include int main() { int num; scanf("%d", &num); char word[100][101]; char* ptr = NULL; long long prev_location; int flag = 1; int count = 0; int j = 0; for (int i = 0; i < num; i++) { scanf("%s"..
-
[ baekjoon ] 2941번 - 크로아티아 알파벳
https://www.acmicpc.net/problem/2941 2941번: 크로아티아 알파벳 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z= www.acmicpc.net #include #include void swap(int loop, char * ptr); int main() { char cro[8][4] = { "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z=" }; char word[101]; int num = 0; scanf("%s", word); char* ptr = NULL; fo..
-
[ baekjoon ] 27951번 - 옷걸이
https://www.acmicpc.net/problem/27951 27951번: 옷걸이 경기과학고등학교에는 아주 무시무시한 부서 하나가 있다. 그 부서의 이름은 바로 '자치부'이다. '자치부'가 하는 주된 역할 중 하나는 아침에 지정된 기숙사에 들어가서 방의 정리 정돈 상태를 www.acmicpc.net #include #include int main() { int num; scanf("%d", &num); int* hanger = (int*)malloc(4 * num * 2); int type_num[3] = { 0, }; for (int i = 0; i < num * 2; i += 2) { scanf("%d", &hanger[i]); type_num[hanger[i] - 1]++; } int up,..
-
[ Dreamhack ] STACK_AEG
이 문제는 nc로 접속을 하면 base64 인코딩이 된 바이너리를 출력해준다. 이를 디코딩하고 분석해서 쉘을 20단계모두 따서 sub flag 인증에 성공하면 플래그를 준다. 한 단계마다 중어진 시간은 10초이고 바이너리에서 bof가 발생하지만 buf의 위치가 계속해서 바뀌기 때문에 buf의 위치를 자동으로 분석해서 진행해야 한다. 바이너리 분석 read에서 bof터지고 카나리는 read바로 아래 printf에서 릭하고 shell함수로 ret바꾸면 되는데 문제는 저걸 자동으로 분석해야한다. 익스 시나리오 base64 인코딩된 바이너리를 받아오고 os.system을 활용해서 base64디코딩한뒤 그 값을 파일에 저장한다. 그 파일을 대상으로 objdump를 사용해서 main함수를 디스어셈블하고 read를 ..
-
[ Dreamhack ] Cat Jump
#define CAT_JUMP_GOAL 37 #define CATNIP_PROBABILITY 0.1 #define CATNIP_INVINCIBLE_TIMES 3 #define OBSTACLE_PROBABILITY 0.5 #define OBSTACLE_LEFT 0 #define OBSTACLE_RIGHT 1 void StartGame() { char cat_name[32]; char catnip; char cmd[64]; char input; char obstacle; double p; unsigned char jump_cnt; srand(time(NULL)); catnip = 0; jump_cnt = 0; puts("let the cat reach the roof! 🐈"); sleep(1); do { /..
-
[ Dreamhack ] STB-lsExecutor
이 문제에서 핵심은 전역변수 sel에 원하는 값을 2바이트 입력할 수 있다는 부분이다. 취약점 처음 read_data(v4, 60); 에서 v4에 60바이트 입력 가능하고 snprintf로 s에 v4의 값을 집어넣어 주기 때문에 ls -a까지 합쳐 총 0x40바이트가 들어간다. 그리고 두번째로 read_data 함수를 호출하며 70바이트를 입력받기 때문에 30바이트 bof가 발생한다. 익스플로잇 일단 최대 9번까지 입력 가능하기 때문에 이전 8번은 아무런 값이나 입력해주고 마지막에만 ret과 sfp를 조작해주고 sel에 "sh"를 넣어주면 된다. gdb에서 보면 system함수의 인자를 rbp-0x70주소에서 가져온다. 이를 이용해서 main함수의 sfp를 sel + 70주소로 변조해주면 system함수..
-
Dreamhack CTF Season 3 Round #2
awesome-basics (pwn)코드를 보면 read함수에서 bof가 터진다.bof가 터지니까 rop을 먼저 생각했었는데 가젯이 없었다.그래서 코드를 다시 보니 ./tmp/flag를 열고 v5에 파일 디스크립터를 받아온뒤그 값을 flag와 buf에 write해주는것이였다. 이것을 이용할 방법을 찾다가buf는 rbp-0x60 위치에 있고v5는 rbp-0x10에 있는 것을 확인하였고buf에서 bof가 터지니까 bof로 v5를 1(stdin)으로 조작해주면write(1, flag, 0x45);가 되어 플래그가 화면상으로 출력되게 된다. exploitfrom pwn import *r = remote("host3.dreamhack.games", 13508)#r = process("./chall")payload..
-
[ Dream hack ] MSNW
1. Nyang 함수에서 Nyang 함수의 sfp를 구한다. 2. Meong함수에서 read를 이용해서 s에 Win함수의 주소를 잔뜩 써준다. 3. 2바이트 오버플로우가 발생하기 때문에 1번에서 릭 한 sfp와 배열 s의 옵셋을 통해 sfp overwrite를 한다. 자 위의 과정을 다 거치면 Meong의 sfp는 배열 s의 주소가 될 것이다. 그리고 Meong함수의 에필로그 과정이 종료되고 다시 Call함수로 return했을 때 Call함수의 rbp는 배열 s의 주소이고 배열 s에는 Win함수의 주소들이 잔뜩 들어있기 때문에 sfp와 ret이 win함수의 주소가 되면서 Call함수가 끝나고 Win함수의 주소로 ret하게 된다. - Exploit from pwn import * pwd = "/home/a..
-
[ Dream hakc ] Santa claus is coming to town
이 문제에서 발생하는 핵심 취약점은 바로 malloc으로 사용자가 제한없이 원하는 크기의 청크를 할당할 수 있다는 부분이다. malloc을 사용해서 힙 영역을 할당할때 엄청 큰 사이즈를 요청해버리면 mmap syscall을 호출한다. 이때 할당받은 영역이 libc가 로드된 주소와의 오프셋이 일정하기 때문에 립씨 베이스를 구할 수 있다. 아 그리고 이 기법을 사용하기 위해서는 립시 버전을 잘 맞춰야 하는데 strings -tx 바이너리 | grep GCC 명령어로 해당 바이너리가 우분투 버전 몇에서 컴파일 됐는지 알 수 있다. 마지막 입력받을 때 free hook을 덮으려고 했는데 자꾸만 free hook 주소보다 높은 주소에 할당이 돼었다. 그래서 엄청 크게 할당 요청을 했더니 다행히 free hook보..
-
[ layer7 ctf ] Christmasgift
getGift wow, fantastic, holy를 모두 1로 만들어 주고 rop을 하면 끝나는 쉬운 문제였지만 rop payload에서 payload에 += 으로 내용을 계속 더해주는게 아닌 계속 = 으로 초기화를 해주고 있었다 그래서 익스코드에 문제가 생겼던 것이였다 문제를 푸는중에 밖에 나가야할 일이 생겨 계속 ctf는 참여하지 못해서 좀 아쉽다. 익스 코드 from pwn import * from ctypes import CDLL import time import math context.log_level = "debug" r = process("/home/asdf/ctf/layer7/christmasgift") e = ELF("/home/asdf/ctf/layer7/christmasgift") ..
-
[ Dream hack ] Dream's Notepad
https://dreamhack.io/wargame/challenges/405/?writeup_id=9011 Dream's Notepad 드림이가 메모장 프로그램을 만들었어요! 취약점을 찾아 드림이가 숨겨둔 메모인 플래그를 읽어보세요! dreamhack.io 문제를 풀며 배운점 - rtc기법을 사용해서 문제를 풀어본 적이 거의 없어서 처음에 r12에 값을 plt주소로 주는 실수를 했다. - read함수에서 마지막 3번째 인자는 size_t 형이기 때문에 범위가 0 ~ 4,294,967,295이다. 따라서 만약 -1을 넘겨주면 read함수에서 입력받는 사이즈가 0xffffffff가 되어 bof가 발생한다.
-
[ Dreamhack ] dirty stack
main int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { unsigned __int64 v3; // rbx unsigned __int64 v4; // [rsp+8h] [rbp-E8h] BYREF __int64 v5; // [rsp+10h] [rbp-E0h] BYREF unsigned __int64 v6; // [rsp+18h] [rbp-D8h] __int64 i; // [rsp+20h] [rbp-D0h] const char *v8; // [rsp+28h] [rbp-C8h] __int64 s[21]; // [rsp+30h] [rbp-C0h] BYREF unsigned __int64 v10; // [rsp+D8h] [..
-
[ Dreamhack ] Zeroshot
https://dreamhack.io/wargame/challenges/426/?writeup_id=8822 ZeroShot 이 문제는 서버에서 작동하고 있는 서비스(ZeroShotV2)의 바이너리와 소스 코드가 주어집니다. 취약점을 익스플로잇해 셸을 획득한 후, “flag” 파일을 읽으세요. “flag” 파일의 내용을 워게임 사 dreamhack.io 문제를 풀며 배운점 - 여러번 aaw가 가능하지만 %d를 사용해서만 입력이 간능한 경우 최대 0xffffffff까지만 입력이 가능하기 때문에 원하는 주소가 4바이트보다 크다면 하위 4바이트 상위 4바이트 나눠서 입력을 주면 된다. - 함수 내부에서 movaps가 실행될 때 rsp가 0x10상태로 정렬되어야 한다. rsp를 정렬시키려면 해당 함수에서 got..
-
[Dreamhack] house_of_spirit
https://dreamhack.io/wargame/challenges/54/?writeup_id=8611 house_of_spirit Desciption 이 문제는 작동하고 있는 서비스(houseofspirit)의 바이너리와 소스코드가 주어집니다. House of Spirit 공격 기법을 이용한 익스플로잇을 작성하여 셸을 획득한 후, "flag" 파일을 읽으세요. "flag" dreamhack.io house of spirit 이란 임의의 주소를 해제하고 할당할 때 재 할당을 통해 임의 주소를 할당받아 원하는 주소에 값을 쓸 수 있게 하는 공격방식이다. 이 문제를 풀면서 주의할 점은 fake 청크를 해제할 때 tcache의 범위를 벗어나면 안된다 왜냐하면 tcache의 경우 속도를 위해 많은 시큐리티 ..
-
[ 화이트햇 콘테스트 ] left_right
game함수에서 취약점이 발생했다. 5번째 줄을 보면 v3이 함수 포인터로 선언이 된 것을 확인할 수 있다. v3을 초기화하지 않으니 만약 v3이 할당되는 메모리 영역에 특정 값이 있다면 해당 값이 call될 것이다. 이제 v3이 할당되는 공간에 특정 값을 넣을 수 있는 곳을 찾아야 한다. left_right 바이너리를 까보면 read_input함수가 여러 곳에서 사용되는데 첫번째로 호출되는 read_input함수에서 buf가 할당되는 주소를 gdb로 확인해보니 v3가 할당되는 공간보다 8바이트 낮은 위치에 할당됐다. 처음 read_input함수가 호출될 때 더미값 8개를 집어넣어주고 바이너리에 있는 wanna_flag함수의 주소를 넣어주면 game함수의 20번째 줄에서 wanna_flag 함수가 호출될..
-
Return to csu [Dreamhack basic_rop_x64]
dreamhack강의에서 return to csu 강의를 못 찾아서 이제까지 return to csu를 공부를 안 했는데 이번에 로드맵 복습을 진행하며 basic_x64_rop을 rtc를 통해 풀어봤다. https://dreamhack.io/wargame/challenges/29/?writeup_id=7999 기존 writeup에 추가했다. RTC란? rop을 할 때 원하는 가젯이 없을때도 rop을 할 수 있는 기법이다. ( 하지만 인자를 최대 3개까지만 할당할 수 있다. ) 위 사진은 __libc_csu_init 함수의 일부 어셈 코드이다. 이 부분만 사용할 것이다. 사진에서 볼 수 있듯이 0x400860에서 r13, r14, r15의 값을 rdx, rsi, edi에 넣어주는 것을 확인할 수 있다. 우..
-
[ Dreamhack ] tcache_dup2
https://dreamhack.io/wargame/challenges/67/ tcache_dup2 Description 이 문제는 서버에서 작동하고 있는 서비스(tcache_dup2)의 바이너리와 소스 코드가 주어집니다. 취약점을 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요. "flag" 파일의 내용을 워게임 dreamhack.io 이 문제에서는 주의해야할 점이 있다. 바로 tc_idx가 낮은값을 갖지 않게 해야한다. 왜냐하면 tc_idx는 빈에 들어간 청크의 개수를 세는 녀석인데 0이면 tcache에 청크가 없다고 판단해서 할당할 때 tcache를 참조하지 않기 때문이다. double free 를 이용하여 쉘을 획득하기 위해서는 allocate를 총 3번해야한다. 1. 더블 프리 후 t..
-
[Dreamhack] tcache_dup
https://dreamhack.io/wargame/challenges/60/ tcache_dup Description 이 문제는 작동하고 있는 서비스(tcache_dup)의 바이너리와 소스코드가 주어집니다. Tcache dup 공격 기법을 이용한 익스플로잇을 작성하여 셸을 획득한 후, "flag" 파일을 읽으세요. "flag" 파일 dreamhack.io 이 문제에서는 tcache에 관한 double free 보호기법이 존재하지 않은 라이브러리를 사용하기 때문에 key값을 조작하는 과정없이 바로 하면된다.
-
[ Dreamhack ] hook, oneshot
https://dreamhack.io/wargame/challenges/34/?writeup_id=8046 oneshot Desciption 이 문제는 작동하고 있는 서비스(oneshot)의 바이너리와 소스코드가 주어집니다. 프로그램의 취약점을 찾고 셸을 획득한 후, "flag" 파일을 읽으세요. "flag" 파일의 내용을 워게임 사이트에 dreamhack.io oneshot문제에서는 전에도 좀 많이 실수했던 recv하는 과정에서 범위를 정확히 하지 않아 문제가 생겼었다. https://dreamhack.io/wargame/challenges/52/?writeup_id=8050 hook Desciption 이 문제는 작동하고 있는 서비스(hook)의 바이너리와 소스코드가 주어집니다. 프로그램의 취약점을 ..
-
[ Dreamhack ] basic_rop_x86
https://dreamhack.io/wargame/challenges/30/?writeup_id=8020 basic_rop_x86 Description 이 문제는 서버에서 작동하고 있는 서비스(basicropx86)의 바이너리와 소스 코드가 주어집니다. Return Oriented Programming 공격 기법을 통해 셸을 획득한 후, "flag" 파일을 읽으세요. "flag" 파일의 dreamhack.io 본 문제를 풀었다면 위 링크를 타고 들어가서 풀이를 볼 수 있습니다. 주의할 점! x64는 인자를 레지스터를 통해 전달하기 때문에인자 전달 순서를 맞출 필요가 없었다. 하지만 x86의 경우 아래 사진과 같이 스택을 순서대로 인자를 전달하기 때문에 rop을 수행할 때도 원하는 인자를 순서에 맞게 구..
-
[ Dreamhack ] basic_rop_x64
buf에 입력을 받을 때 bof가 발생한다. main 함수 어셈블리어로 보면 rbp-0x40 위치에 buf가 위치한다 즉 main ret에 도달하기 위해서는 0x48 바이트가 필요하다. 더미값 0x48바이트 넣고 rop해주면 끝!! from pwn import * import time context.log_level = "debug" p = process("./basic_rop_x64") #p = remote("host3.dreamhack.games", 16872) e = ELF("./basic_rop_x64") libc = ELF("./libc.so.6") putsplt = 0x4005c0 readplt = 0x4005f0 readgot = 0x601030 poprdi = 0x00000000004008..
-
[ Dreamhack ] ssp_001
취약한 c 코드 분석 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void get_shell() { system("/bin/sh"); } void print_box(unsigned char *box, int idx) { printf("Element of index %d is : %02x\n", idx, box[idx]); } void menu() { puts(..
-
[ Dreamhack ] x64_basic_rop
취약한 c언어 코드 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main(int argc, char *argv[]) { char buf[0x40] = {}; initialize(); read(0, buf, 0x400); write(1, buf, sizeof(buf)); return 0; } 위의 코드에서 read 함수를 보면 bof가 발생한다. 공격 시..
-
백준 11720문제 정답 (배열 동적할당)
- 문제를 풀 때 다양한 방식으로 접근해야겠다. - 문자열을 선언할 때 문자열의 끝을 알려주는 null의 공간도 함께 생성하는 것 꼭 기억하기!! - malloc()함수와 free()함수의 사용법을 알게 되었다. (malloc함수) * #include 헤더 파일을 사용함. * 만약 int형 배열 size 동적 할당을 하면 int* i = (int*) malloc (sizeof(int) * num); //배열의 요소가 num개의 배열을 동적할당한다. (그만큼의 메모리를 할당한다.) (int*) : malloc의 반환형이 void* 이므로 (int *)형태로 형변환을 한다. sizeof(int) : 괄호 안에 자료형 타입을 바이트로 연산해준다. * num : sizeof()로 연산한 자료형의 바이트 곱하기 ..