전체 글 64

[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바이트 형식으로 정렬을 하게 ..

[TeamH4C_FTZ] Level1 ~ Level5

이번에는 해커스쿨에서 배포하는 워게임인 FTZ를 이어서 보도록 하겠습니다. Trainer10까지 모두 풀게 되면 level 1에 대한 로그인 정보를 얻을 수 있습니다. level 1 비밀번호를 얻었으므로 level 1에 접속하여 문제를 확인하도록 하겠습니다. Level 1 level 1에 접속하여 현재 디렉터리에 있는 파일들을 확인해보도록 하겠습니다. ls명령으로 파일들을 확인하여 보면 hint라는 파일이 보입니다. 문제의 hint로 보이기에 cat명령으로 확인하여 보면 setuid가 걸려있는 파일이 존재하여 이용하는 문제로 확인이 됩니다. setuid파일이 설정되어 있는 파일을 찾기 위해서는 find명령 옵션에서 perm옵션을 사용하여 찾을 수 있습니다. perm옵션을 이용하여 level 2가 소유자로..

[TeamH4C_HackCTF] 시스템 해킹_기초문제

저번 게시물에 이어 시스템 해킹 기초 문제를 좀 더 풀어보겠습니다. 이번에는 HackCTF사이트의 문제를 가져왔습니다. 값 변조 Basic_BOF #1 실행 주소 값 변조 Basic_BOF #2 return 주소 값 변조 offset 문자열 변환으로 return 주소 값 변조 g++ pwn 1. Basic_BOF #1 버퍼 오버 플로우 문제로 주어진 파일을 IDA로 열어 확인하였을 때 특정 변수가 -55903873일 때, 즉, DEADBEEF라는 16진수 값을 가질 때 shell을 획득하도록 되어있었습니다. 그렇기에 payload에 deadbeef를 패키징하여 16진수 형태를 표현하고 앞의 dummy값은 s크기인 40byte를 설정하여 check값을 변조하면 됩니다. 2. Basic_BOF #2 포인터로..

[TeamH4C_GDB] 메모리 분석

메모리 분석 내용으로 GNU 디버거라 하는 GDB를 통해 확인해보겠습니다. 참고한 사이트는 https://bpsecblog.wordpress.com/2016/03/08/gdb_memory_1/ 여기입니다. 메모리 분석 메모리는 유저 영역과 커널 영역으로 나뉘어 저장되어있습니다. 유저 영역은 사용자가 사용하는 영역이고, 커널 영역은 사용자가 마음대로 접근을 하지 못하도록 제한한 영역으로 생각하면 됩니다. 시스템 운영에 필요한 메모리와 운영체제를 커널 영역으로 분리한 것입니다. 나누는 영역은 운영체제마다 다르고, 설정에 따라 영역의 크기를 조정할 수 있습니다. 유저 영역을 보면 코드 영역, 데이터 영역, 힙 영역, 스택 영역이 존재하는데 순서대로 코드 영역에는 코드가 어셈블리 코드로 올라갑니다. 데이터 영역..

TeamH4C_ProjectH4C 2021.03.14