분석 이번 문제에서는 admin을 id로 주고 pw만을 get으로 받습니다. 그리고 보호기법으로 addslashes를 사용하네요. addslashes는 쿼리문에서 오류가 발생할만한 백슬래시(\), 작은 따옴표('), 큰따옴표(") 등을 \를 앞에 붙여 escape시키는 함수입니다. db에서 꺼내왔을 때는 백슬래시를 제거해서 원래의 문자열이 되도록 하는 stripslashes라는 함수도 있습니다. php에서는 magic_quotes_gpc라고 해서 이 작업을 자동으로 해주는 경우도 있다네요. 그래서 addslash가 되기 이전에 그냥 쿼리를 참으로 우회하면 hello admin만 나옵니다. 이후에 addslashes하여 쿼리를 다시 보내서 쿼리의 결과로 받아온 pw가 존재하고, 결과의 pw와 입력한(add..
분석 php를 분석해보면 id가 admin이어야 하고 no에는 '이나 " ` 등을 사용하지 못하도록.. 되어있네요 no에서 따옴표를 넣어서 하는 공격을 막아두는 것 같습니다. 음.. 그리고 id가 guest로 고정되어있고 입력받는 부분은 no밖에 없습니다. no 만을 이용해서 id를 admin이 되도록 해야하는데.. 따옴표를 우회할 방법이 있지 않을까 싶습니다. 스터디에서 preg_match를 우회하는 방법으로 char, hex를 이용해서 우회한다고 했는데.. 일단 숫자를 넣어보니 1번 넘버로 로그인이 되네요. 2번부터는 안 됩니다. 혹시 몰라 %27 (')도 넣어봤는데 안 되네요. or 문으로 id가 admin임을 넣어주면 될텐데.. 풀이 ppt에 char(0x61646d696e)라고 적혀있어서 cha..
두 번째로 풀 문제는 cobolt 분석 이전 그렘린 문제와 비슷하게 구성되어있으나, if 부분에 admin을 검사하는 것이 추가되었습니다. 그러면 id가 admin이어야 한다는 정보를 주고 있네요. id가 admin이고 pw는 md5로 해싱됩니다. 방식이 여러가지 있겠지만, 처음에 이건 될까 ? 싶어서 생각해본 방식 중 하나는 이렇게 넣어주는 것이었습니다. (참고로 #는 ascii로 0x23 => %23임) 그러면 id가 admin이고 쿼리가 참이 되리라 생각했지만 위에 보시다시피 admin이 아니라고 나옵니다. 이유를 생각해보면 and 연산과 or 연산 때문 일 것 같습니다. 그래서 DB를 만들어서 해봤습니다. 시나리오 테스트 member라는 테이블에 칼럼을 다음과 같이 구성해두었습니다. 여기서 위와 ..
S! 웹해킹 스터디를 시작하면서 3주차 스터디 과제는 LOS(Lord Of Sql injection) stage 15까지 푸는 것이었습니다. 포너블 했을 때 익숙한..! 이번엔 LOB가 아닌 LOS 풀이를 올립니다. (헤헤 기대된당) 분석 모든 익스는 분석부터! 웹에서는 php 코드가 주어집니다. sql 인젝션은 php를 통해서 DB를 조작하는데, 이때 보내는 query문을 자신의 입맛에 맞게 바꾸어 공격하는 것이랍니다. 여기서는 get 방식으로 id, pw를 보내는데, get 방식은 url 뒤에 데이터를 보내기 때문에, https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=abcd&pw=1234 이렇게 id와 pw를 정해..
분석 checksec 결과 18세 이상인지 물어보고 아니면 종료시킨다, IDA에선 이렇게 되어있고 이번엔 win 함수가 없다. 흑.. https://tribal1012.tistory.com/39 LOBYTE, BYTE1, HIBYTE 매크로 LOBYTE : 가장 하위 1바이트를 말함, 리틀엔디안으로 들어간 메모리 값 중 가장 오른쪽 값? BYTE1 : 리틀엔디안으로 들어간 메모리 값 중 오른쪽 2번째 값? BYTE2 : 리틀엔디안으로 들어간 메모리 값 tribal1012.tistory.com Y인 경우에 이름을 입력받는데 동적할당한다. 해당 주소에 입력하고 usr에 strcpy를 한다(overflow가능?) 그리곤 welcome 이후에 printf한다. printf에서 포맷스트링이 bss에 있다는 점이 ..
이번 문제는 misalignment인데, 드림핵 master_canary를 풀이하려다가 계속 이해가 안 돼서(아니 이게 왜 안됨?) xyz를 풀기로 했다. 이것도 안되면 어쩔 수 없고..ㅠ 분석 쓰다보니 생각났는데 노션이나 다른게 더 이쁘다. 역시 티스토리는 이제 거를 때가 온다. 일단 보호기법은 다 걸려있다. IDA에서는 win이라는 함수가 있고 이를 실행시켜야 하는 듯. 코드를 이해하려면 포인터 이해가 필요..! 경계를 잘못 지정해서 s[1]에 마지막 부분 0x0000000000000000 에서부터 s[2] 0x0000000000000000 까지 0xDEADBEEF 를 대입한다. 그렇게 대입이 되면 s[1] s[2] 순서로 0xEF00000000000000 0x0000000000DEADBE 이렇게 들..
이제 풀이를 잘 공개하지 않으려 했는데, 이건 커리큘럼에 있는 문제이고 shellcraft 설명이 (shellcode 설명 때부터) 미흡한 부분이 있어서 그냥 블로그에 글을 쓰고자 한다. system hacking advanced 에 있는 문제이다. 분석 // Name: bypass_syscall.c // Compile: gcc -o bypass_syscall bypass_syscall.c -lseccomp #include #include #include #include #include #include #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } void sandbox() { scmp_filter_..
분석 이번에는 웬일로 바이너리에 checksec을 해보면 RELRO가 Partial. PIE가 없다. 64bit 바이너리 그리곤 이렇게 input도 있다. 이제 ida를 보자 주석도 좀 달고 했는데 canary를 입력받아두고 0x50만큼을 memset으로 0으로 덮어버린다 canary까지는 아니다 어차피 크기가 0x60이라서 scanf는 아무래도 입력받은 인자 수를 반환하는 듯 하니 3개의 숫자를 입력해야하는 것 같고 v7으로부터 [v6]번째 인덱스에 v4+v5를 대입한다. 그리고 win이라는 함수도 존재한다. got등을 덮을 때 이걸로 덮으면 되겠다. 풀이 v4는 rbp-0x78 v5 는 0x70 v6 0x68 v7은 0x60에 있다. 흠 .. gdb를 보아하니.. got가 아니라 ret를 덮어야 할 ..