분류 전체보기(40)
-
64bit format string bug 문제 풀이
오늘은 sschall에 있는beginner_fsb문제를 풀어보고자 한다. beginner_fsb는 64비트로 컴파일된 elf파일이다. 먼저 이 바이너리의 보호기법을 알아보겠다. 보호기법을 확인해보면 parial relro와 카나리, nx bit가 켜져 있는 것을 확인할 수 있다. 하지만 해당 보호기법들은 포맷스트링 버그와 연관되어 있지 않기 때문에 보호기법을 우회하거나 할 필요는 없다. 소스 코드를 살펴보면, 먼저 메인함수 시작점에서 input 0x20만큼의 데이터가 \0으로 초기화된다. 그 다음 우리가 덮어씌워야될 can_you_overwrite_me 변수가 나온다. 해당 변수를 변경하기위해서 포맷스트링 버그가 필요하다. read함수에서 0x1f만큼 데이터를 입력받음으로써 오버플로 취약점이 발생하고 다..
2023.10.08 -
64bit format string bug
저번 시간에 이어 이번엔 64bit format string bug에 대해 알아보고자 한다. 지난 시간에 설명한 32bit format string bug와는 조금 다른 구성을 가진다. 32비트에서는 주소를 앞에 쓰는 방식으로 포맷스트링 버그를 유발했다면 이번엔 변조하고자 하는 주소를 뒤에 써줘야된다. 이 이유를 다음 예제를 통해서 설명하고자 한다. 먼저 지난 번과 같은 코드인지 64비트로 컴파일 했다는 점에서 차이가 존재한다. 글로벌 변수를 0x12345678로 맞춰줘야지 correct문자열이 뜬다. 메모리 상에서 보면 0x7ffc1eae8560부터 우리가 덮어쓸 주소가 들어가고 offset이 6이니 우리가 덮어 쓸 주소의 offset은 9가 된다. 따라서 2바이트 씩 나눠서 입력을 해준다. 4660은..
2023.10.01 -
format string bug 32bit
오늘은 포맷스트링 버그에 대해 이야기하고 한다. 포맷 스트링 버그(Format String bug,이하 FSB)란 포맷팅을 수행하는 printf() 같은 특정한 C 함수들에서 검사되지 않는 입력 값을 포맷 스트링 파라미터로 사용하는 것으로부터 나온다. 이를 설명하는 예제 코드를 준비 했다. 해당 코드는 printf 함수에서 파라미터를 검색하지 않은 상태에서 입력 값을 받은 뒤 그 입력 값들에 의해서 메모리의 값이 leak되는 현상이 존재한다. 일반 문자를 입력했을 때는 문제가 되지 않지만 %p, %x를 통해 메모리에 있는 값들을 leak할 수 있다. 예를 들면 위 사진과 같다. 일반 문자열을 입력했을 때는 문제가 되지 않지만 서식 문자를 집어 넣는 경우, 메모리가 가리키고 있는 값을 노출시킬 수 있다. ..
2023.09.30 -
Dreamhack - oneshot
오늘은 oneshot에 대해 알아보고자 한다. 그전에 어떤 보호기법이 있는 지 살펴보겠다. 먼저 Partial RELRO가 걸려져 있고 카나리 보호기법은 해제되어 있으면 nx비트가 enable됨에 따라 쉘코드를 스택 영역에 실행할 수 없으며, PIE가 걸려져 있음으로 바이너리 주소가 랜덤하게 바뀌기 때문에 libc_Base주소를 구해야 한다. 다음 코드를 살펴보겠다. stdout주소를 출력하는 것을 볼 수 있다. 그 다음 msg의 사이즈는 16인데 46만큼 입력받음으로써 버퍼오버플로 취약점이 발생하게 된다. 이후 check 값에 대한 검증이 이루어지고 msg를 msg의 사이즈만큼 0으로 초기화 시킨다. 먼저 objdump -D 옵션을 활용하여 stdout의 이름을 확인하였다. 이름은 IO_2_1_stdo..
2023.09.24 -
Dreamhack - basic_rop_x64
오늘은 저번 시간에 했던 rop_x32에 이어서 rop_x64문제 풀이를 진행하고자 한다. rop_x64는 64비트로 컴파일된 바이너리 파일이다. 먼저 어떤 보호기법이 걸려져 있는 지 살펴보겠다. Partial RELO는 5섹션에 대해 쓰기가 불가능하지만 .got.plt, .bss, .data영역에 대한 got 덮어쓰기가 가능하다. NX비트가 활성화되어 스택에서 쉘코드가 실행이 안된다. pie는 안걸려져 있음으로 바이너리 주소가 랜덤화하게 바뀌진 않는다. 먼저 바이너리 파일을 실행시키기 전 소스코드를 살펴보겠다. 소스코드를 보면 buf값이 0x40으로 지정되어 있는데 read함수에서 0x400만큼 입력받음으로써 버퍼오버플로우 취약점이 발생한다. 따라서 이 버퍼오버플로우 취약점을 활용해서 rop로 연계할 ..
2023.09.23 -
Dreamhack - basic_rop_x86
이번 시간에는 전 포스터에서 올렸던 32bit rop문제를 복습할겸 가져왔다. 문제 설명은 위에 같다. 취약점을 찾아서 익스플로잇해서 플래그를 구하는 과정을 설명하겠다. 이 소스코드에서는 buf값을 0x40으로 정의하고 있는데 read함수에서 0x400만큼을 읽음으로써 버퍼 오버플로우라는 취약점이 발생게된다. 이 버퍼오버플로우 취약점을 악용해서 익스를 하고자 한다. 이때 라이브러리의 베이스 주소를 구해서 프로그램 간의 주소를 맞춰줘야한다. 때문에 read함수의 got 부분이 필요하다. 먼저 plt 부분의 주소는 0x80483f0인 것을 확인할 수 있다. 이 부분을 좀 더 자세히 들여다 보겠다. 조금 더 자세히 보면 0x804a00c인 것을 확인할 수 있고 여기가 read함수의 got라는 것을 확인할 수 ..
2023.09.16