TeamH4C 48

[TeamH4C_CTF] UMDCTF2021 write-up

UMDCTF에 많은 시간을 할당하지 못하여 문제를 풀지 못하였는데 참여 경험으로도 많은 도움이 되었습니다. 기본적인 문제였던 것 같았지만 본격적인 pwnable문제를 접하면서 더욱 공부가 필요하다는 것을 느꼈습니다. 이번 연도에는 확실하게 더욱 알기 위해 많은 시간을 투자해야겠다고 생각을 하게 만든 대회였습니다. 이제 writeup을 작성해보겠습니다. reverse engineering, misc, pwnables, crypto, forensics, advantageous adventures, web, steganography, osint, programming 문제 중 pwnables와 forensics문제를 정리해보겠습니다. pwnables 첫 번째 pwnable문제로 메모리 보호 기법을 확인하면 N..

[TeamH4C_CTF] 2021 HackPack write-up

부족하지만 HackPack에서 진행한 CTF를 참여한 후, 문제를 정리해보았습니다. ctf2021.hackpack.club/ HackPack CTF An educational CTF that aims to complement security courses at North Carolina State University ctf2021.hackpack.club pwn, reverse, web, misc의 문제 구성으로 짜여있었으며 저는 web과 reverse문제를 풀었으며, pwn은 대회가 끝난 후 팀원이 먼저 풀었던 문제를 재구성하여 풀어보았습니다. pwnable 기초 pwn문제로 system함수를 이용하여 권한을 획득하는 형식입니다. hint를 보게 되면 디버깅을 하라고 되어있기에 chal파일을 디버깅해보..

[TeamH4C_pwn] 포너블 문제 연습

안녕하세요! 이번에는 pwnable에 대한 기초적인 문제를 만들어 보았습니다. pwnable 1 #define _CRT_SECURE_NO_WARNINGS #include #include int main() { int key; char buf[50]; printf("buf: 0x%p key: 0x%p\n", &buf, &key); fflush(stdout); gets(buf); fflush(stdout); if (key == 0x44454144) system("/bin/bash"); } 아래와 같이 ASLR기법을 해제하고 컴파일을 하여 32비트로 컴파일하면서 NX가 적용되지 않도록 해줍니다. NX비트의 적용방법으로는 아래의 주석과 같습니다. sysctl -w kernel.randomize_va_space=..

[TeamH4C_PWNABLE] 시스템 해킹_연습문제9

이번 문제는 Toddler's Bottle에 9번째 문제인 mistake를 풀어보겠습니다. 접속 정보는 아래의 그림과 같이 mistake user에 pwnable.kr host서버이며, port는 2222번이고, guest password를 가졌습니다. 접속하여 사용자 디렉터리의 파일들을 확인하고 소스파일을 살펴본 후, 해당 실행파일을 실행하였습니다. 먼저 실행하여 아무 숫자나 적었을 때 종료되지 않아 코드를 다시 살펴보았는데 길이를 10만큼 받아 함수에 넣는 것을 볼 수 있어 10자리가 되어야 한다는 것을 알 수 있었고 fd의 값이 연산 순위가 잘못되어 있어 0이 되는 것을 알 수 있었습니다. 여기서 사용자로부터 fd를 10바이트 읽어 들여 pw_buf에 저장시킨 후 scanf함수로 pw_buf2를 입..

[TeamH4C_PWNABLE] 시스템 해킹_연습문제6

pwnable.kr에서 제공하는 Toddler's Bottle에서 random문제를 봐보도록 하겠습니다. 아래 ssh접속 정보를 가지고 user은 random이고 host는 pwnable.kr인 서버에 2222번 port번호로 접속하여 guest라는 password를 입력하여 로그인할 수 있다는 것을 알 수 있습니다. 로그인하여 해당 사용자 디렉터리에 무엇이 있는지 확인하여 보면 random의 실행파일과 소스파일이 보일 것입니다. 그렇기에 random실행파일을 실행하여 어떠한 방식으로 실행되는지 확인하여 보고 소스파일을 열어보았습니다. 소스파일을 보았을 때 key값을 입력받아 rand() 함수로 받아온 값과 xor 하여 그 값이 0xdeadbeef의 값이 되었을 때 system함수를 호출한다는 것을 알 ..

[TeamH4C_C언어] 포인터 연산

포인터를 사용해왔는데 포인터끼리의 연산은 어떤 방식으로 진행되는지 알아보겠습니다. 포인터로 선언한 변수에는 메모리 주소가 들어있습니다. 그렇기에 이 포인터 변수에 연산을 진행하게 되면 메모리 주소에 일정 숫자들을 연산하게 되는 것입니다. 즉, 포인터 연산은 메모리 주소를 옮겨 다니기 위해 사용됩니다. 메모리 주소가 커지는 상황을 순방향으로 이동(forward), 메모리 주소가 작아지는 상황을 역방향으로 이동(backward)라고 하면 forward는 0xFFFFFFFF로 이동하는 것이고 backward는 0x00000000로 이동하는 것으로 알고 있으면 됩니다. 포인터 연산은 *와 /는 사용할 수 없습니다. 대신, 아래와 같은 연산은 가능합니다. 포인터 + 값 포인터 - 값 포인터++ 포인터-- ++포인..

[TeamH4C_C언어] 열거형과 자료형 변환

이번에는 코딩도장 Unit57과 Unit58에 설명되어 있는 열거형 사용과 자료형 변환에 대해 정리해보겠습니다. 열거형 사용 enum사용 switch문 결합 사용 for문 결합 사용 자료형 변환 기본 자료형 변환 포인터 자료형 변환 구조체 자료형 변환 열거형 사용 열거형은 정수형 상수에 이름을 붙여 개수가 많더라도 편리하게 해 주도록 합니다. enum키워드를 사용하며 enumeration의 약자입니다. enum 열거형이름 { 값1 = 초깃값, 값2, 값3 }; [enum 열거형이름 변수이름;]으로 변수를 선언해야 사용이 가능하며 아래에 내려오는 값들은 1씩 증가하여 자동으로 초기값이 할당됩니다. 초기값을 할당하지 않으면 0부터 시작하는 규칙이 있습니다. 열거형의 값들은 대문자만 이용하는 경우가 많고 단어..

[TeamH4C_C언어] 구조체 추가 정리(비트 필드)

지금까지 멤버가 각 자료형 크기만큼 공간을 차지하는 것을 확인했다면 지금부터 비트 필드를 사용하여 비트 단위로 저장시키는 것을 알아볼 것입니다. struct 구조체이름 { 정수자료형 멤버이름 : 비트수; }; 위의 형식이며 비트 수 부분에 비트 크기를 지정하여 저장하도록 합니다. 2진수 형태로 1 글자당 1비트로 하여 숫자를 저장할 수 있습니다. 비트 수를 초과하게 된다면 나머지 비트에 해당하는 값은 버려지고 남은 값들만 출력되게 됩니다. 또한, 비트 필드의 각 멤버는 최하위 비트(Least Singnificant Bit, LSB)부터 차례대로 배치됩니다. 여기서, 비트 필드의 멤버를 선언하는 자료형보다 큰 비트 수는 에러가 발생하기에 지정할 수 없습니다. 공용체와 함께 사용하게 된다면 구조체에서 각 비..

[TeamH4C_PWNABLE] 시스템 해킹_연습문제1-4

이번 문제는 pwnable.kr에서 제공하는 문제를 풀어보았습니다. 화질이 좋지 못하여 간단하게 봐주시길 바랍니다 :) fd collision bof flag 문제 1 해당 문제는 ssh로 서버에 접속하여 특정 실행파일을 실행할 때 인자 값을 주어 결과를 얻도록 하는 문제입니다. ssh로 접속한 후 접속 디렉터리에 존재하는 파일을 확인하고 실행시켜 봅니다. 모든 파일을 확인하여 보았고 이용 가능한 것은 fd실행파일이라는 것을 알게 되었기에 fd소스파일을 살펴보겠습니다. fd소스파일에는 argc가 2 미만이면 종료되게 돼있기에 인자 값을 주어 해당 조건문을 넘기도록 만듭니다. 그 후 인자에는 0x1234의 값을 넣어 fd가 0이 되어 buf값 자체가 LETMEWIN이라는 단어와 비교되도록 만들어 flag가..

[TeamH4C_C언어] 구조체와 공용체 사용

구조체가 메모리에 올라갈 때의 이용과 구조체와 정의 방법은 같지만 멤버 지정방식이 다른 공용체에 대해 정리해보겠습니다. 구조체의 사용과 활용 구조체 멤버 정렬 구조체 메모리 활용 ( 초기화, 복사 ) 구조체 배열 사용 공용체의 사용 공용체의 시작 구조체와 공용체의 활용 구조체의 사용과 활용 구조체가 메모리에 올라갔을 때 멤버를 정렬하는 기능으로 메모리에 접근할 때 비트에 따라 바이트 단위가 다르게 접근됩니다. 32비트 CPU일 때는 4바이트 단위, 64비트 CPU는 8바이트 단위로 접근합니다. 32비트 CPU에서 4바이트보다 작은 데이터에 접근할 경우 내부적으로 시프트 연산이 발생하여 효율이 떨어진다 합니다. 그렇기에 효율성이 좋도록 적절한 데이터 크기인 2, 4, 8, 16바이트 형식으로 정렬을 하게 ..