본문 바로가기

2017/08/30

LIFE 사진전 즐거운 방학을 맞아 무지하게 바쁘게 살다 노름병이 도져서 잠시 놀았다. 예술의전당에서 10월초까지 진행하는 LIFE사진전이다. 유럽여행에서 다녔던 미술관들이 생각나서 포스터를 보자마자 가기로 했다. 왜 LIFE사진전인가 했는데 LIFE 잡지사에서 그간 촬영한 사진들을 전시하는 곳이었다. 무식이 들통난 순간... 전혀 모르고 갔지만 중간중간 화면에서 방영하는 다큐나 사진에 딸린 설명을 보며 전시회를 즐겼다. 한국의 근현대사에 관련된 사진도 있고 역사적으로 유명한 사람들의 모습도 볼 수 있었다. 오랜만에 느끼는 여유롭고 조용한 분위기도 너무 좋았다. 놀러나온김에 가본 방탈출카페 첨이었는데 생각보다 재밌었다. 젤 어려운 난이도였는데 1분차로 시간내에 못풀었다 깨비 그리고 역시 마무리는 맥주 노는김에 비싸게 세..
blackjack blackjack게임이다. millionare에게 flag를 준단다. big money get that 해보자. 일단 게임을 해보자 500달러를 주고 게임을 시작한다. cash부분이 millionare가 되면 될 것 같다. 저 부분을 보여주는 코드로 따라가보자 게임을 수행하는 부분이다. cash_test는 돈이 없으면 쫓아내는 코드이다. randcard()는 카드를 랜덤하게 보여주는 코드이다. 위의 카드모양을 출력해주는 것 같다. dealer()는 잘은 모르겠지만 무언가 수행한 뒤ealer has a total of~~ 이 부분을 출력해준다. 젤 중요한 betting()의 소스이다. 배팅금액을 받고 소지금보다 큰지 확인한다. 그런데 소지금이 더 크면 다시 입력을 받고 이 값은 수정없이 그냥 바로 반환한다..
passcode 10점짜리 문제!!! 시~~~작!!! 파라미터도 없고 반환값도 없는 함수 두 개를 연달아서 실행시켰다. 이렇게 실행하면 assembly에선 연달아서 2번 call을 호출한다. 즉 두 함수의 ebp값이 같다는 것이다. welcome함수에선 그냥 string을 입력받고 출력해준다. 그냥 passcode1,2를 입력받길래 비교값을 그냥 입력했는데 몇번을 해도 안된다. 잘 보니까 scanf에 &passcode1이 아니라 그냥 passcode1로 써놨다. 이러니 안되지... 맨 처음으로 돌아가서 welcome과 login은 같은 ebp 주소를 갖는다. 그래서 welcome의 name과 passcode 2개가 겹칠거라 생각하고 디버깅을 해 보았다. name을 입력받고 출력하는 scanf와 printf 호출부분이다...
lotto 뭔가 쉬운문제만 계속 푸는것 같지만... 이름이 너무 맘에들었으니 풀어주겠다. ( 실제로 하진 않음 ) 이번엔 소스보단 실행을 먼저 해보자 ( 진짜 실제론 안함 ) 정말 한눈에 딱 알게 해놨다. 설명은 화면만 봐도 알 수 있으니 생략하자 ( help는 죄 printf고 exit는 정말 그냥 끝내버린다. ) 코드가 긴 관계로 중요한 부분만 잘라냈다. random하게 받은 6개의 값을 1~45로 한정하고 비교해 match가 6이 되면 flag를 보여준다. /dev/urandom이 의심스러워 여러 방면으로 검색하다 디버깅해본 결과 random값을 잘 주는 멀쩡한 파일이었다. 이번엔 비교하는 for문을 확인해보자. 길이가 6인 문자열 2개를 비교할거면 for문 1개면 되지만 2중으로 사용하였다. 때문에 subm..
mistake 뭔가 실수를 했는갑다. hint : operator priority 뭘 어쩌란건지 한참 보다가 힌트에서 힌트를 얻고( 역시 문제를 잘 봐야되 ) 연산자 위주로 살펴보았다. if( fd=open("/home/mistake/password",O_RDONLY,0400) 0) 이걸 보고 알았다. 연산 순서를 찾아보니 대입연산자가 비교연산자보다 순위가 뒤인걸 알아냈다. 즉 '>'연산을 '='연산보다 먼저 수행하는 것이다. open()함수는 파일을 성공적으로 열면 file descriptor 번호를 반환한다. 이때 0,1,2는..
random 순서대로 passcode를 풀 차례지만 10점에 허걱하고 옆에있는 1점짜리 random 먼저 풀기로 했다. 이름이 random이니 random하게 순서가 매겨졌다( 뭐래... ) rand()함수를 사용해 받은 값과 scanf()로 입력받은 key값을 xor한 값이 0xdeadbeef여야 한다. rand()함수를 사용해본 사람들은 알겠지만 srand를 사용해 시드값을 바꿔주지 않으면 rand()함수는 매번 똑같은 값을 반환한다. 웹 컴파일러를 사용해 확인해보자 매번 1804289383을 반환한다. 그럼 이 값과 xor연산을 했을 때 0xdeadbeef가 나오는 값은 random값과 0xdeadbeef의 xor연산을 통해 알 수 있다. 0xdeadbeef ^ 0x6B8B4567(random in hex) =..
flag 뭔진 몰라도 binary file이고 리버싱 하란다. 일단 받아다 hexeditor로 열어보았다. UPX로 패킹된 ELF파일이다. 우선 리눅스에 받아다가 unpacking 해서 실행시켜보자. malloc으로 할당받은 공간에 flag값을 저장할거란다. 일단 디버깅해보자 에서 malloc을 실행시키고 에서 flag가 있는 주소값을 rdx에 넣어주고 있다. 그럼 까지만 실행시킨 뒤 rdx의 주소에 위치한 문자열을 확인해보자 rdx에는 주소값 0x496628이 입력되어 있다. 주소값에 입력된 문자열을 확인하는 명령어는 x/s [address] 이다. 못찾고 찾은 척 한거 아니다.