목록Study (6)
9oat's LAB
C프로그래밍에 대한 지식은 거의 없다시피 해서 푸는데 꽤 고생하고 오래 걸린 문제였는데, 문제랑 직접적으로 관련 없는 부분에서 이해가 안가는 점이 생겼었다. 먼저 문제에 대해서 설명을 하자면 코딩을 이용해 문제 이름 처럼 여러가지 input(argv,env,socket)으로 값을 넘겨나가는 문제였다.코딩을 해야하니까 일단 파일을 만들어야 하는데, input 바이너리가 있는 홈 디렉토리(/home/input2)에는 쓰기권한이 없어서, /tmp에 작업공간을 만들어서 풀어야했다. 그리고 [사진 1] input 코드 일부 input 문제코드 중에는 파일을 읽어들이는 코드(\x0a)가 있었는데, 내 생각엔 위와같은 코드일 때 input 바이너리와 동일한 디렉토리에 '\x0a'가 만들어져야 input이 해당 파일을..
Memory Leak 기법을 정리한 게시물의 내용 중 아무 함수로 RTL하는 건 아니고 send나 write같은 함수를 이용한다. 이 같은 함수들은 특정 값(buf 등)을 출력하거나 전송할 수 있는 함수들인데, 이 특정 값을 내가 원하는 주소로 인자를 구성한 뒤 RTL하여 값을 출력시키는 것이다. 라는 내용을 적었었다. RTL로 Memory Leak을 발생시키는 것에 대한 내용인데, 보통 CTF 문제들로 공부한 내용을 기반으로 정리하다 보니 send, write 함수를 사용하는 게 많아서 저렇게 적었었다. 근데 이 방법의 기본적인 원리는 단순히 출력(또는 전송)함수를 이용한 RTL로 임의의 주소의 값을 출력하는 것이기 때문에 send나 write가 아니더라도 뭐 printf라던가 puts도 똑같은 역할을..
원격 Exploit에서 함수 주소 offset 계산과 함께 사용하는 기법인 Memory Leak에 대하여 알아보자. Memory Leak은 말 그대로 메모리를 유출시키는 것인데 방법에 따라서 인접 메모리 영역의 값을 유출시킬 수도 있고, 특정한 주소의 값을 유출 시킬 수도 있다. 여러가지 방법들이 있겠지만 본 게시물은 Buffer Overflow를 이용한 기본적인 Memory Leak 두 가지를 다룬다. 사실 이것밖에 모름 1. Overflow를 이용해 변수와 변수 사이의 Null을 덮어씌워 인접한 메모리의 값을 유출시키는 기법2. Return To Library를 이용해 특정 주소의 값을 유출시키는 기법 첫 번째 방법부터 보자. 변수와 변수 사이에는 Null Byte가 존재하고, 보통 출력 함수들이 값..
로컬 익스플로잇 시엔 gdb에서 제공하는 print 명령어로 손쉽게 원하는 함수의 주소를 찾을 수 있지만, CTF 등 원격 익스플로잇의 경우 라이브러리가 다르니 함수의 주소를 찾기가 어렵다. 이 때 함수 주소를 찾기 쉽도록 해주는 도구가 바로 Libc-Database. [사진 1] ASLR이 적용된 후 Library Base 변화 Libc-Database를 설명하기 전에 원리 겸 라이브러리에 대해 설명하자면 함수 주소는 Library Base + offset 이다. ASLR이 적용되어 있다 하더라도 Library Base가 랜덤으로 설정될 뿐 함수의 offset은 변하지 않는다. 이 offset은 Libc 버전 별로 달라지며, Libc 버전 별 offset을 DB화 시킨 것이 Libc-Database다...
저번 글의 연장선에 있는 글이다. gnu-redirect-function이 호출될 때 /lib/ld-linux.so.2를 거쳐서 호출됐었는데, 저번엔 단순히 함수 호출 과정이겠거니 하고 넘어갔기 때문에 함수가 호출되는 과정 자체가 궁금해졌다. [사진 1] 먼 길을 떠나요 글의 전반적인 내용과 흐름은 bpsecblog의 PLT와 GOT 자세히 알기 게시물을 참고했다.본 글은 가독성이 다소 떨어지므로 bpsecblog의 글과 함께 보는 것이 좋을 것 같다. strcpy를 대상으로 하여 한 줄씩 의식의 흐름을 따라 실행해보자..! [사진 2] PLT&GOT 함수를 호출하면 먼저 함수의 PLT로 간다. 그리고 PLT엔 함수의 GOT로 jmp하는 코드가 있고 GOT에는 함수의 주소(Library)가 저장되어 있어..
BOF 문제를 풀이하면서 생겼었던 궁금증에 대해 연구해보고자 한다. 함수가 한 번 호출되고 나면 함수 호출 메커니즘에 의해 GOT에는 함수의 라이브러리 주소가 저장된다고 알고있다. 그래서 그 주소가 해당 함수의 실제 주소겠거니 생각했는데 gdb의 print로 함수 주소를 출력했을 땐 이와 다른 주소가 출력된다. [사진 1] 이 글을 쓰는 이유.jpg 보통 exploit payload를 구성할 땐 print로 exploit에 사용할 함수의 주소를 출력해서 그 주소를 활용했었는데 이 주소가 got에 저장되는 라이브러리 함수 주소와 다르다니.. 프로그램이 실행되는 중 함수를 호출할 때는 해당 함수의 PLT 주소를 call한다. 이것은 GOT에 저장된 주소를 이용한다는 것과 같기 때문에 실제로 프로그램이 동작하..