분류 전체보기 (68) 썸네일형 리스트형 __builtin_expect() ( __glibc_unlikely(), __glibc_likely() ) 해당 글은 glibc를 분석할 때 자주 보게 되는 __builtin_expect(), __glibc_unlikely()가 무엇인지 설명하기 위해 작성한 글이다. 사전 지식우리가 코드를 짜서 이를 실행할 때, CPU는 현재의 실행 흐름에 맞게 하나의 코드씩 순차적으로 연산하는 것이 아니다. CPU는 "분기 예측"을 통해 효율성을 극대화 시키는데, 이를 아주 짧게 설명해보자면 다음과 같다. CPU는 앞에서 만나게 될 분기문의 결과를 예측하여 특정 경로를 타고가며 코드를 미리 연산해놓는다. 그리고 그 분기 예측이 맞았을 경우에는 미리 연산해뒀던 결과들을 이용하고, 분기 예측이 틀렸을 경우에는 미리 연산해뒀던 것들을 모두 버리고 분기문의 결과에 맞게 새로 분기 예측을 시작한다.(분기 예측에 관해 몇 줄로 요약하.. ptmalloc2(glibc 2.23) _int_malloc(), _int_free() 동작 분석 2023년 8월 시점에 glibc 2.23에 대해 글을 쓰는 이유 glibc는 버전이 업데이트 될 때마다 새로운 기능을 추가하거나 취약점들을 보완하며, 현재 release된 최신 glibc 버전은 glibc 2.38이다. 그럼 '왜 이런 구닥다리 버전의 glibc를 분석하는 글을 기재하냐?' 라고 물을 수 있는데, 이는 glibc가 업데이트 될 때마다 취약점들을 업데이트하고 새로운 기능들을 추가하긴 하지만, 대부분은 원래 있던 버전의 소스코드에 코드를 "추가" 하는 것이지, 원래 있던 코드를 삭제하고 그것을 "새로 쓰는 것"은 아니기 때문이다. 따라서 한 버전의 glibc를 통해 heap의 동작을 이해한다면, 이후에 나오는 glibc 버전에서는 어떤 요소가 새로 추가되었는지, 또는 변경되었는지만 확인하면.. random 소스 코드 #include int main(){ unsigned int random; random = rand();// random value! unsigned int key=0; scanf("%d", &key); if( (key ^ random) == 0xdeadbeef ){ printf("Good!\n"); system("/bin/cat flag"); return 0; } printf("Wrong, maybe you should try 2^32 cases.\n"); return 0; } 설명: rand()는 seed값에 변화를 주지 않으면 실행마다 같은 값을 반환한다. main()을 disassemble한 결과이다 random = rand();// random value! 해당 코드는 에 해당한다. .. passcode 해당 문제의 write-up을 이해하기 위해선 함수가 호출 및 종료(return) 됐을 때, 스택에 어떤 변화가 일어나는지 알아야 한다. 이를 위해 아래 게시글을 참조하자. http://www.tcpschool.com/c/c_memory_stackframe 코딩교육 티씨피스쿨 4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등 tcpschool.com 소스 코드 #include #include void login(){ int passcode1; int passcode2; printf("enter passcode1 : "); scanf("%d", passcode1); fflush(stdin); // ha! mommy told me that 32bit is vulner.. pwnable.kr (ssh) 바이너리 다운 받기 & pwntools 이용하기 바이너리 로컬로 다운받아오기 https://c0wb3ll.tistory.com/entry/pwnablekr-%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EB%B0%9B%EA%B8%B0 pwnable.kr 바이너리 받기 딜레이랑 gdb-peda 등등 로컬에서 간편하게 분석하기 위해 바이너리를 받아오는 방법을 찾아보았다. 그리고 앞으로 풀이는 pwntools 사용법도 익힐겸 로컬에 바이너리를 받아와 분석 후 pwntools를 이 c0wb3ll.tistory.com pwntools 이용하기 https://oz1ng019.tistory.com/31 [PWN] Pwntools ssh접속 후 특정 바이너리 실행 및 argv 입력 pwnable.kr을 풀려다가 pwntools을 사용하지 않고는.. flag 해당 문제는 리버싱 문제로 바이너리만이 주어진다. 바이너리 실행 결과는 다음과 같다 --------------------------------- 여담이 길어요 죄송합니다.. --------------------------------- 그래서 나는 바이너리를 리버싱 해야겠구나 생각하고 IDA를 켜서 수십 시간 동안 꼬리에 꼬리를 무는 함수들을 타고 내려가며, '아니 Toddler's Bottle'이라면서 너무 어려운 거 아니야..?' 라고 생각하며, 엄청난 삽질을 했다. 그러나 아무리 생각해도 뭔가 이상했다. main함수는 보이지도 않고 해당 함수들을 타고 들어가면 이상한 내용의 코드들과, 꼬리에 꼬리를 무는 또 다른 이상한 함수들을 호출하는 것의 연속이었다. pwndbg로 확인해도 결과는 똑같았다. ma.. validator 이 문제와는 별개로 Stage 15 -> Logical Bug: Path Traversal에 관한 내용은 아래에 잘 설명돼있다. https://dreamhack.io/lecture/courses/111 Logical Bug: Path Traversal Path Traversal 취약점에 대해 배우고, 이를 공격에 활용하는 방법을 학습합니다. dreamhack.io 이 문제는 소스코드 없이 바이너리만이 주어진다. 따라서, 바이너리를 리버싱 하여 취약점을 찾아내고 그를 통해 exploit 해야 하는 문제이다. (참고로. 바이너리로 주어진 validate_dist와 validate_server는 코드를 살펴봤을 때 차이가 없어 나는 validate_dist를 타겟으로 삼아 문제를 풀었다.) 보호 기법 어떠한 .. cmd_center Logical Bug: Command Injection과 관련해서는 https://dreamhack.io/lecture/courses/108 Logical Bug: Command Injection 명령어를 실행해주는 함수를 잘못 사용하여 발생하는 Command Injection취약점에 대해 배워보겠습니다. dreamhack.io 에 아주 자세하고 간략하고 알기 쉽게 설명돼있으니 강의를 꼭 수강하기 바란다. 소스 코드 #include #include #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } int main() { char cmd_ip[256] = "ifconfig"; int dummy; char .. 이전 1 2 3 4 5 6 ··· 9 다음