刚刚看了17年seccon的baby_stack
看着这个感觉好亲切。
就这么点逻辑。
两个输出。
这个地址当参数建了个结构体。
然后创建了个切片大小0x200
读0x200
一片祥和与美好…
gdb跑一下发下断不下来…
它只会在一些奇奇怪怪的函数里面去跑
那首先怀疑是改了go的符号表。
go的符号表一般都在gopclntab段
可以去看大佬系列文章
那就只能老老实实动调来瞅了嘛。
上网了解到go语言的main函数是通过runtime_main函数创建线程然后调用的
下断点下在那里之后还是不大好调
不知道啥时候进主函数。
我们直接掏出我们之前在本地写的逆向小程序
gdb在runtime.main打个断点
不仅可以知道函数在源码哪个位置
还可以直接调
非常好用。
就能把源码掏出来。
func main() {
g := getg()
// Racectx of m0->g0 is used only as the parent of the main goroutine.
// It must not be used for anything else.
g.m.g0.racectx = 0
// Max stack size is 1 GB on 64-bit, 250 MB on 32-bit.
// Using decimal instead of binary GB and MB because
// they look nicer in the stack overflow failure message.
if goarch.PtrSize == 8 {
maxstacksize = 1000000000
} else {
maxstacksize = 250000000
}
// An upper limit for max stack size. Used to avoid random crashes
// after calling SetMaxStack and trying to allocate a stack that is too big,
// since stackalloc works with 32-bit sizes.
maxstackceiling = 2 * maxstacksize
// Allow newproc to start new Ms.
mainStarted = true
if GOARCH != "wasm" { // no threads on wasm yet, so no sysmon
systemstack(func() {
newm(sysmon, nil, -1)
})
}
// Lock the main goroutine onto this, the main OS thread,
// during initialization. Most programs won't care, but a few
// do require certain calls to be made by the main thread.
// Those can arrange for main.main to run in the main thread
// by calling runtime.LockOSThread during initialization
// to preserve the lock.
lockOSThread()
if g.m != &m0 {
throw("runtime.main not on m0")
}
// Record when the world started.
// Must be before doInit for tracing init.
runtimeInitTime = nanotime()
if runtimeInitTime == 0 {
throw("nanotime returning zero")
}
if debug.inittrace != 0 {
inittrace.id = getg().goid
inittrace.active = true
}
doInit(&runtime_inittask) // Must be before defer.
// Defer unlock so that runtime.Goexit during init does the unlock too.
needUnlock := true
defer func() {
if needUnlock {
unlockOSThread()
}
}()
gcenable()
main_init_done = make(chan bool)
if iscgo {
if _cgo_thread_start == nil {
throw("_cgo_thread_start missing")
}
if GOOS != "windows" {
if _cgo_setenv == nil {
throw("_cgo_setenv missing")
}
if _cgo_unsetenv == nil {
throw("_cgo_unsetenv missing")
}
}
if _cgo_notify_runtime_init_done == nil {
throw("_cgo_notify_runtime_init_done missing")
}
// Start the template thread in case we enter Go from
// a C-created thread and need to create a new thread.
startTemplateThread()
cgocall(_cgo_notify_runtime_init_done, nil)
}
doInit(&main_inittask)
// Disable init tracing after main init done to avoid overhead
// of collecting statistics in malloc and newproc
inittrace.active = false
close(main_init_done)
needUnlock = false
unlockOSThread()
if isarchive || islibrary {
// A program compiled with -buildmode=c-archive or c-shared
// has a main, but it is not executed.
return
}
fn := main_main // make an indirect call, as the linker doesn't know the address of the main package when laying down the runtime
fn()
if raceenabled {
racefini()
}
// Make racy client program work: if panicking on
// another goroutine at the same time as main returns,
// let the other goroutine finish printing the panic trace.
// Once it does, it will exit. See issues 3934 and 20018.
if atomic.Load(&runningPanicDefers) != 0 {
// Running deferred functions should not take long.
for c := 0; c < 1000; c++ {
if atomic.Load(&runningPanicDefers) == 0 {
break
}
Gosched()
}
}
if atomic.Load(&panicking) != 0 {
gopark(nil, nil, waitReasonPanicWait, traceEvGoStop, 1)
}
exit(0)
for {
var x *int32
*x = 0
}
}
if isarchive || islibrary {
// A program compiled with -buildmode=c-archive or c-shared
// has a main, but it is not executed.
return
}
fn := main_main // make an indirect call, as the linker doesn't know the address of the main package when laying down the runtime
fn()
if raceenabled {
racefini()
}
然后在这里发现了main_main
对标这道题
就会发现它把主函数的名改成了math_init
非常可恶。
math_init里面输出字符都不用字符串的
就你拿字符串交叉引用也找不到的
好家伙。
下面的步骤呢就是寻常步骤
据说是个游戏
又得嘎嘎逆向
逆向完其实又是个栈溢出
没啥意思了就
重点我感觉这道题能学到的还是如何处理改过符号表这件事。游戏据说网上可以直接搜的到。
剩下的逆向劳动就不做了。
还有别的事要忙。
贴几个大佬exp
可以去大佬那里看看具体exp是啥。
虎符ctf2022
HFCTF(虎符)2022 Pwn gogogo WriteUp
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)